Tuesday, December 7, 2010

AsyncController and custom action invokers

If you are trying to get AsyncControllers to work, you might run into this gem when you try to test your controller:

The resource cannot be found

If this happens to you, a custom action invoker is likely to be the culprit. In my case, I was using Castle Windsor, and I had extended ControllerActionInvoker to provide dependency injection to my action filters. My action invoker looked something like this:

public class CastleActionInvoker : ControllerActionInvoker
{
private IKernel kernel;
public CastleActionInvoker(IKernel kernel)
{
this.kernel = kernel;
}
//...
}


And this is how I had registered the action invoker with Windsor (this assumes you are using a controller factory that is aware of Windsor):


Container.Register(Component.For<IActionInvoker>()
.ImplementedBy<CastleActionInvoker>()
.LifeStyle.Transient);
view raw Global.asax.cs hosted with ❤ by GitHub


All I had to change to fix the problem was to make my custom action invoker inherit AsyncControllerActionInvoker instead:

public class CastleActionInvoker : AsyncControllerActionInvoker
{
//...
}


AsyncControllerActionInvoker implements IAsyncActionInvoker and adds a few new methods. Depending on what you are trying to accomplish with your custom invoker, you may need to override a few of these new methods as well.

Interestingly enough, I did not have to change how the invoker was registered with Windsor.

2 comments: