2

MVC4 WebApi コントローラーと Dispose パターンに関連する問題を発見したと思います。問題はポスト アクション メソッドにあり、応答は例外の説明です。

Multiple actions were found that match the request:
Void Post(System.String) on type MVC4Api.Controllers.ValuesController
Void Dispose() on type MVC4Api.Controllers.ValuesController

Dispose パターンは、この記事から提供されています。問題を以下の定型コードだけに減らしました。なお、この問題は Get メソッドでは発生せず、Post メソッドでのみ確認済みです。パスに投稿して試してみてください/api/values

public class ValuesController : ApiController
{
    public void Post([FromBody]string value)
    {
    }

    private bool _disposed;

    protected override void Dispose(bool disposing)
    {
        if (_disposed)
        {
            return;
        }

        _disposed = true;

        base.Dispose(disposing);

        if (disposing)
        {
            // dispose of dependencies
        }
    }

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

私の質問は、Post メソッドを呼び出すにはどうすればよいですか? そして、この問題の原因は何ですか?

編集: エラーはルーティングに関するものであるため、ルーティングを制御する WebApiConfig の下に追加しました。これは、起動時に Global.asax に通常どおり読み込まれ、新しい WebApi プロジェクトを開始してから変更されていません。

public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
        config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );
    }
}
4

1 に答える 1

2

エラー メッセージを正しく解釈すると、ソリューションを理解するのがはるかに簡単になりDispose()ますPost()。(それ自体はかなりばかげているようです)。したがって、エラーは事実上、この決定を下すのを手伝ってくれるように私たちに求めています.

私の好みのオプションは、 Action メソッドでNonActionAttributeクラスを使用することです。Dispose()これは、リクエストのルーティング先を決定する際に Dispose メソッドを考慮しないというアクション セレクターへの明確で透過的な指示です。

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

Dipose()もう 1 つのオプションは、メソッドのアクセサを に変更することですprotectedが、それは明らかではありません。

于 2013-07-08T17:13:16.233 に答える