gpt4 book ai didi

c# - 带有处置模式的 MVC4 WebApi Controller 发布操作导致发现多个操作异常

转载 作者:太空宇宙 更新时间:2023-11-03 11:01:38 25 4
gpt4 key购买 nike

我想我已经发现 MVC4 WebApi Controller 与 Dispose 模式有关的问题。问题出在 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

处置模式来源于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 }
);
}
}

最佳答案

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

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

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

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

关于c# - 带有处置模式的 MVC4 WebApi Controller 发布操作导致发现多个操作异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17490753/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com