0

新しい MVC4 ASP.Net Web API システムを使用しています。

WebClient を使用してテスト プロジェクトで API を呼び出しています。GET または POST を使用すると、問題なく動作します。他のものを使用すると、Method Not Allowed が表示されます。次のヘッダーを挿入して、実際にメソッドを「偽造」しています。一部のファイアウォールの制限により、エンドユーザーもこれを行う必要があるため、これを行っています。

IIS 経由で URL を呼び出しています (つまり、cassini ではありません) - 例: http://localhost/MyAPI/api/Test

wc.Headers.Add("X-HTTP-Method", "PUT");

IIS でスクリプト マッピングを調整しようとしましたが、拡張機能がないため、何を調整するのかわかりません。

何か案は?よろしくニック

4

1 に答える 1

7

(X-HTTP-MethodまたはX-HTTP-Method-Override) ヘッダーは、そのままでは Web API によってサポートされていません。カスタムを作成する必要があります(以下の実装では、本来あるべきメソッドでDelegatingHandlerリクエストを行っていることを前提としています):POST

public class XHttpMethodDelegatingHandler : DelegatingHandler
{
    private static readonly string[] _allowedHttpMethods = { "PUT", "DELETE" };
    private static readonly string _httpMethodHeader = "X-HTTP-Method";

    protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
    {
        if (request.Method == HttpMethod.Post && request.Headers.Contains(_httpMethodHeader))
        {
            string httpMethod = request.Headers.GetValues(_httpMethodHeader).FirstOrDefault();
            if (_allowedHttpMethods.Contains(httpMethod, StringComparer.InvariantCultureIgnoreCase))
            request.Method = new HttpMethod(httpMethod);
        }
        return base.SendAsync(request, cancellationToken);
    }
}

DelegatingHandlerあとはinを登録するだけですGlobal.asax:

protected void Application_Start(object sender, EventArgs e)
{
    GlobalConfiguration.Configuration.MessageHandlers.Add(new XHttpMethodDelegatingHandler());
    ...
}

これでうまくいくはずです。

于 2012-04-30T13:44:07.293 に答える