2

我想我发现 MVC4 WebApi 控制器与 Dispose Pattern 结合使用存在问题。问题在于 Post Action 方法,响应是对异常的描述:

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方法确认过。请通过 Posting to the path 尝试一下/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 }
        );
    }
}
4

1 回答 1

2

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

我的首选选项是使用Action 方法NonActionAttribute上的类。Dispose()这是对 Action Selector 的明确且透明的指示,在决定将请求路由到何处时不考虑 Dispose 方法。

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

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

于 2013-07-08T17:13:16.233 回答