1

我已经实现了一个 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 对象的转换。

任何帮助将不胜感激!

4

2 回答 2

7

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

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

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

于 2013-09-21T16:03:38.810 回答
2

实际上,System.Web.Http.ApiController已经实现了 IDisposable:

因此,如果您的控制器拥有数据库连接,请执行以下操作:

public class ValuesController : ApiController
{
    private Model1Container _model1 = new Model1Container();

    protected override void Dispose(bool disposing)
    {
        if (disposing)
        {
            if (_model1 != null)
            {
                _model1.Dispose();
            }
        }
        base.Dispose(disposing);
    }
}
于 2018-04-06T17:44:39.923 回答