0

Web サービスと通信する MVC アプリがあります (C# で記述され、通常は Azure で実行されますが、デバッグのために IIS Express でローカルに実行しています)。Web サービスは、HTTP GET および POST をサポートする API を公開しており、PUT を追加しようとしています。現在、すべての Web サービス コントローラーには、 または のいずれ[HttpGet]かでマークされたメソッドが[HttpPost]あります (パラメーターはそれぞれ[FromUri]またはとして渡され[FromBody]ます)。[HttpPut]メソッドを既存のコントローラーに追加し、パラメーターを としてマークしました[FromBody]。次のようになります。

[HttpPut]
public HttpResponseMessage UpdateLastCheck(HttpRequestMessage httpRequest, [FromBody] RequestParameters requestParameters)
{
    return Process(httpRequest, (RequestParameters)requestParameters, DoUpdateLastCheck);
}

クライアント側では、jQuery $.ajax を使用して API を直接呼び出します。

$.ajax({
    url: url,
    type: 'PUT',
    dataType: "application/json",
    data: data,
    complete: completeCallback,
    success: function (data)
    {
        ...
    },
    error: errorCallback
});

何が起こっているのかというと、リクエストが私のコードに届いていないということです。どこかで傍受されており、どこにあるのかわかりません。Fiddler を実行すると、ブラウザーが実際に PUT 要求ではなく OPTIONS 要求を行っていることがわかります。

OPTIONS http://localhost/ViewPoint.Web.API/Notification/UpdateLastCheck HTTP/1.1
Host: localhost
User-Agent: Mozilla/5.0 (Windows NT 6.2; WOW64; rv:22.0) Gecko/20100101 Firefox/22.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Origin: http://localhost:9999
Access-Control-Request-Method: PUT
Connection: keep-alive

サーバーは次のように応答しています。

HTTP/1.1 200 OK
Allow: OPTIONS, TRACE, GET, HEAD, POST
Server: Microsoft-IIS/8.0
Public: OPTIONS, TRACE, GET, HEAD, POST
X-Powered-By: ASP.NET
Date: Wed, 18 Sep 2013 22:21:20 GMT
Content-Length: 0

PUT はその許可リストに含まれていないため、理由がわかりません。web.config ファイルに何か足りないものはありますか? そのリストがどのように作成されているのかさえわかりません-ソリューションのグローバル検索では何も見つかりませんでした。

すべてを POST に変更すると、問題なく動作します (つまり、 を使用し[HttpPost]て呼び出します)。しかし、私たちは API を可能な限り RESTful にしようとしており、この特定のアクションに使用する適切な動詞は PUT です。$.ajaxPOST

これをうまく説明できていなかったら申し訳ありません。これは私の最初の Web サービス API であり、問​​題を診断するために何を知る必要があるかわかりません。また、IIS 構成の問題である場合、Azure にプッシュするとどうなりますか?

更新: IE (10) を使用すると問題は発生せず、FireFox と Chrome でのみ発生します。Fiddler によると、IE は直接 PUT リクエストを作成し、それが機能します。一方、FireFox と Chrome は OPTIONS リクエストを行い、その結果はAllow: OPTIONS, TRACE, GET, HEAD, POST(PUT がないため、機能しないと思います)。

4

1 に答える 1

1

問題は、IIS Express が既定でPUT動詞とDELETE動詞をサポートしていないことです。ただし、これは簡単に修正できます。IIS Express の FAQ ページにその方法が示されています。

  1. 最初のステップは、IIS Express 構成ディレクトリに移動することです。このディレクトリへのパスは%userprofile%\documents\IISExpress\config. このパスをエクスプローラーに入力するだけで、config ディレクトリが開きます。
  2. applicationhost.configファイルをテキスト エディタで開きます。
  3. 次のエントリを含む行を検索します。<add name="ExtensionlessUrl-Integrated-4.0"
  4. その行に、サポートされている動詞が表示されます。デフォルトでは、verbs 属性は次のように構成されています。 PUTまたはDELETE動詞verb="GET,HEAD,POST,DEBUG"について言及されていないことがわかります。これらの動詞のサポートを追加するには、属性に追加するだけです。verbverb="GET,HEAD,POST,DEBUG,PUT,DELETE"
  5. 最後の手順は、IIS Express を再起動して、構成ファイルの変更を反映させることです。

これらの手順を実行すると、IIS Express はPUTおよびDELETE要求を適切に処理します。

于 2013-09-20T09:26:41.813 に答える