具有Dispose模式的MVC4 WebApi控制器发布操作导致发现多个操作异常

时间:2013-07-05 14:02:17

标签: c# asp.net-mvc-4 dispose

我认为我发现MVC4 WebApi控制器与Dispose Pattern一起出现问题。问题在于Post Action Method,响应是Exception的描述:

Multiple actions were found that match the request:
Void Post(System.String) on type MVC4Api.Controllers.ValuesController
Void Dispose() on type MVC4Api.Controllers.ValuesController

配置模式来自this article。我把问题简化为下面的锅炉板代码。值得指出的是Get方法不会出现这个问题,我只用Post方法确认了它。请通过发布到/api/values路径进行试用。

public class ValuesController : ApiController
{
    public void Post([FromBody]string value)
    {
    }

    private bool _disposed;

    protected override void Dispose(bool disposing)
    {
        if (_disposed)
        {
            return;
        }

        _disposed = true;

        base.Dispose(disposing);

        if (disposing)
        {
            // dispose of dependencies
        }
    }

    public new void Dispose()
    {
        Dispose(true);
        GC.SuppressFinalize(this);
    }
}

我的问题是如何调用Post方法?是什么导致了这个问题?

修改 由于错误是关于路由我在WebApiConfig下面添加了控制路由的。这是在Global.asax启动时正常加载的,并且自启动新的WebApi项目以来没有改变。

public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
        config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );
    }
}

1 个答案:

答案 0 :(得分:2)

正确解释错误消息时,更容易理解解决方案:在选择请求时,WebApi操作选择器无法在Dispose()Post()方法之间做出决定。 (这本身似乎很愚蠢)。所以错误实际上是要求我们帮助做出这个决定。

我首选的选项是在NonActionAttribute Action方法上使用Dispose()类。这是一个清晰透明的指令,指示Action Selector在决定请求路由的位置时不考虑Dispose方法。

[NonAction]
public new void Dispose()
{
    Dispose(true);
    GC.SuppressFinalize(this);
}

另一种选择是将Dipose()方法的访问者更改为protected,但这并不是那么明显。