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 からの応答は次のとおりです。要求に一致する複数のアクションが見つかりました。

コントローラーに Post 要求に一致する 2 つのメソッドがあるため、混乱するのは Web API ルーティングです。デフォルトでは、アクション メソッドを選択するためのどのルールにも一致しない API コントローラーのパブリック メソッドは、Post メソッドと見なされます。この件に関する詳細については、こちらを参照してください。

問題を解決するには、[NonAction] 属性を Dispose メソッドに追加して、Web API が無視するようにします。

于 2013-09-21T16:03:38.810 に答える