MVC 4/Web API テンプレートで始まる ASP.NET Web アプリケーションをセットアップしました。物事は本当にうまくいっているようです - 私が認識している問題はありません。Chrome と Firefox を使用してサイトを閲覧しました。私は Fiddler を使用してテストしましたが、すべての応答はお金にかかっているようです。
そこで、この新しい Web API を使用する簡単な Test.aspx の作成に進みます。スクリプトの関連部分:
<script type="text/javascript">
$(function () {
$.ajax({
url: "http://mywebapidomain.com/api/user",
type: "GET",
contentType: "json",
success: function (data) {
$.each(data, function (index, item) {
....
});
}
);
},
failure: function (result) {
alert(result.d);
},
error: function (XMLHttpRequest, textStatus, errorThrown) {
alert("An error occurred, please try again. " + textStatus);
}
});
});
</script>
これにより、REQUEST ヘッダーが生成されます。
OPTIONS http://host.mywebapidomain.com/api/user HTTP/1.1
Host: host.mywebapidomain.com
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:24.0) Gecko/20100101 Firefox/24.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://mywebapidomain.com
Access-Control-Request-Method: GET
Access-Control-Request-Headers: content-type
Connection: keep-alive
そのままでは、Web API は 405 Method Not Allowed を返します。
HTTP/1.1 405 Method Not Allowed
Cache-Control: no-cache
Pragma: no-cache
Content-Type: application/xml; charset=utf-8
Expires: -1
Server: Microsoft-IIS/8.0
X-AspNet-Version: 4.0.30319
X-Powered-By: ASP.NET
Date: Mon, 30 Sep 2013 13:28:12 GMT
Content-Length: 96
<Error><Message>The requested resource does not support http method 'OPTIONS'.</Message></Error>
OPTIONS動詞がデフォルトでWeb APIコントローラーに接続されていないことを理解しています...したがって、UserController.csに次のコードを配置しました。
// OPTIONS HTTP-verb handler
public HttpResponseMessage OptionsUser()
{
var response = new HttpResponseMessage();
response.StatusCode = HttpStatusCode.OK;
return response;
}
...そして、これにより 405 Method Not Allowed エラーが解消されましたが、応答は完全に空です - データが返されません:
HTTP/1.1 200 OK
Cache-Control: no-cache
Pragma: no-cache
Expires: -1
Server: Microsoft-IIS/8.0
X-AspNet-Version: 4.0.30319
X-Powered-By: ASP.NET
Date: Mon, 30 Sep 2013 12:56:21 GMT
Content-Length: 0
There must be additional logic... I don't know how to properly code the Options method or if the controller is even the proper place to put the code. Weird (to me) that the Web API site responds properly when viewed from Firefox or Chrome, yet the .ajax call above errors out. How do I handle the "preflight" check in the .ajax code? Maybe I should be addressing this issue on the client side's .ajax logic? Or, if this is an issue on the server side due to not handling the OPTIONS verb.
Can anyone help? This must be a very common issue and I apologize if it's been answered here. I searched but didn't find any answers that helped.
UPDATE IMHO、これはクライアント側の問題であり、上記の Ajax JQuery コードに関係しています。これは、Web ブラウザーから mywebapidomain/api/user にアクセスしたときに、Fiddler が 405 エラー ヘッダーを表示しないためです。この問題を再現できる唯一の場所は、JQuery .ajax() 呼び出しからです。また、上記の同一の Ajax 呼び出しは、サーバー (同じドメイン) で実行すると正常に機能します。
別の投稿を見つけました:プロトタイプ AJAX リクエストが GET ではなく OPTIONS として送信されました。関連しているように見える501エラーが発生しますが、私は彼らの提案をいじくり回しましたが、成功しませんでした. どうやら、JQuery は、Ajax リクエストがクロスドメイン (私の場合) である場合に、何らかの方法で OPTIONS ヘッダーをトリガーするいくつかのヘッダーを追加するようにコーディングされています。
'X-Requested-With': 'XMLHttpRequest',
'X-Prototype-Version': Prototype.Version,
It just seems that there should be a better solution available than modifying core code in JQuery...
The answer provided below assumes this is a server-side issue. Maybe, I guess, but I lean toward clients, and calling a hosting provider isn't going to help.