4

私は ASP.Net Web API を試しています。これは、慣例により、コントローラー メソッドを Get()、Put、Post、および Delete の Restful スタイルに分割します。私の質問は、Ajax 以外のブラウザー リクエストから来る可能性のある PUT および DELETE リクエストをどのように処理するかということです。

では、id = 123 の foobar があるとしましょう。通常のフェッチ リクエストは次のようになります。

/foobars/123

アイテムを削除するには、Restful な方法で次を発行します。

DELETE /foobars/123

ただし、PUTandDELETEはブラウザーの標準ではなく、リクエストが非 Ajax ブラウザー リクエストからのものである場合、信頼できる十分な主要なブラウザー サポートがありません。したがって、一般的に受け入れられている回避策は次のとおりです。

POST /foobars/123?_method=DELETE (source: Restful Web Services)

新しい ASP.Net Web API について、この問題に対処するためのベスト プラクティス/一般的なアプローチはありますか? 私が望むのは、 a を持つものはすべてコントローラーのメソッドに_method=DELETEルーティングされ、コントローラーの PUT() メソッドにルーティングされることです。DELETE()_method=PUT

4

1 に答える 1

3

これは、を使用して簡単に実現できますDelegatingHandler

したがって、次のようにコーディングします。

public class HttpMethodHandler : DelegatingHandler
{
    protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
    {
        var queryString = HttpUtility.ParseQueryString(request.RequestUri.Query);
        if(!string.IsNullOrEmpty(queryString["_method"]))
        {
            request.Method = new HttpMethod(queryString["_method"]);
        }
        return base.SendAsync(request, cancellationToken);
    }
}

次に、ハンドラーをパイプラインに追加します。それについてのブログがあります。

于 2012-06-26T21:37:59.207 に答える