我认为我发现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 }
);
}
}
答案 0 :(得分:2)
正确解释错误消息时,更容易理解解决方案:在选择请求时,WebApi操作选择器无法在Dispose()
和Post()
方法之间做出决定。 (这本身似乎很愚蠢)。所以错误实际上是要求我们帮助做出这个决定。
我首选的选项是在NonActionAttribute
Action方法上使用Dispose()
类。这是一个清晰透明的指令,指示Action Selector在决定请求路由的位置时不考虑Dispose方法。
[NonAction]
public new void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
另一种选择是将Dipose()
方法的访问者更改为protected
,但这并不是那么明显。