Skip to main content
 首页 » 编程设计

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

2024年01月21日27kevingrace

我已经实现了一个 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 将忽略它。