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



我想我发现了MVC4 WebApi控制器与Dispose模式结合使用的问题。问题出在后操作方法上,响应是对异常的描述:

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

dispose模式来源于本文。我已经将问题简化为下面的锅炉板代码。值得指出的是,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 }
        );
    }
}

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

我的首选选项是在Dispose() Action方法上使用NonActionAttribute类。这是对操作选择器的一个清晰透明的指示,在决定将请求路由到哪里时不要考虑Dispose方法。

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

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

最新更新