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 です。$.ajax
POST
これをうまく説明できていなかったら申し訳ありません。これは私の最初の Web サービス API であり、問題を診断するために何を知る必要があるかわかりません。また、IIS 構成の問題である場合、Azure にプッシュするとどうなりますか?
更新: IE (10) を使用すると問題は発生せず、FireFox と Chrome でのみ発生します。Fiddler によると、IE は直接 PUT リクエストを作成し、それが機能します。一方、FireFox と Chrome は OPTIONS リクエストを行い、その結果はAllow: OPTIONS, TRACE, GET, HEAD, POST
(PUT がないため、機能しないと思います)。