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

标签 c# asp.net-web-api dispose

我已经实现了一个 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/

相关文章:

c# - 从 JObject 中删除重复项

c# - 如何使用 WebAPI 和 Linq 序列化部分类

asp.net-web-api - 属性路由和继承

linq-to-sql - 当暴露 IQueryable 时,DataContext 何时被处置?

c# - 什么时候需要 Dispose?

c# - 带有 Windows Azure 托管的信号器

c# - 将字符串转换为 TitleCase、SentenceCase、UpperCase 和 LowerCase,但如果单词在 "quotation marks"内则忽略大小写

c# - 任何人都可以推荐使用 C# 发送和接收 SMS 的任何基于英国的优秀 SMS 网关吗?

asp.net - ASP WebApi - 如何处理潜在的 XSS 攻击

java - LibGDX - 应该先执行texture.dispose(),然后再执行batch.dispose()?还是没有什么不同?