gpt4 book ai didi

c# - 实现 Web Api Controller - 为什么使用 IDisposable 会干扰路由?

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

我已经实现了一个 Web Api 类:

public class ControllerCore : ApiController 
{
...do some basic things...
}

然后在派生类中有:
public class LoginController : ControllerCore
{
public HttpResponseMessage Get()
{
// Get login status
}

public HttpResponseMessage Post([FromBody]LoginParams login)
{
// Do actual log in
}
}

这一切都很好。但我想让 ControllerCore 一次性使用,这样我就可以创建和清理一个包含开放数据库连接的托管对象:
public class ControllerCore : ApiController, IDisposable
{
protected DataAccess DAL;
private bool isDalDisposed;

public ControllerCore()
: base()
{
DAL = new DataAccess(); // opens a connection that will have to be cleaned up
isDalDisposed = false;
}

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

protected override void Dispose(bool disposing)
{
if (!isDalDisposed)
{
isDalDisposed = true;
if (disposing)
DAL.Dispose();
}
base.Dispose(disposing);
}

...other code here...
}

问题是,虽然 LoginController 上的“Get”仍然有效,但“Post”永远不会被调用 - 路由似乎不起作用。由于唯一的区别是 Post 有参数,我想知道 Disposable 修改是否会以某种方式破坏从 JSON 到 LoginParams 对象的转换。

任何帮助将不胜感激!

最佳答案

我的猜测是来自 Web API 的响应是:找到与请求匹配的多个操作。

搞砸的是 Web API 路由,因为您的 Controller 有两个匹配 Post 请求的方法。
默认情况下,API Controller 上任何与选择操作方法的任何规则都不匹配的公共(public)方法都被视为 Post 方法。
您可以找到有关该主题的更多信息 here .

要解决您的问题,只需将 [NonAction] 属性添加到您的 Dispose 方法,以便 Web API 将忽略它。

关于c# - 实现 Web Api Controller - 为什么使用 IDisposable 会干扰路由?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18934225/

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