具有Dispose模式的MVC4 WebApi控制器后操作导致发现多个操作异常
本文关键字:操作 发现 异常 模式 Dispose MVC4 控制器 WebApi 具有 | 更新日期: 2023-09-27 18:21:06
我想我发现了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
,但这并不明显。