私はこれを一日中叩いてきました、そしてそれはいくつかの助けを得る時です。いくつかの.netコードから.netMVCWebAPIアプリケーションを呼び出そうとしています。エラー詳細ポリシーを常にに上げた後でも、実際の情報がないWebAPIからステータスコード500を受け取ります。だから私はFiddlerを開いて、少なくとももう少し見ることができるようになりました。これは、.netからの呼び出し後に、Fiddlerを介してIISから返されるものです。
{"メッセージ": "エラーが発生しました。"、 "例外メッセージ": "ユーザーの資格情報が無効です。"、 "ExceptionType": "System.Exception"、 "StackTrace": "at RemoteManagementService.Controllers.ProvisioningController.PostLogOn(RequestModel `1リクエスト)など...
(スタックトレースは、アクションメソッドの閉じ括弧をエラー行として参照しています)
.net HttpClient呼び出しコード:
this.DefaultRequestHeaders.Add("Origin", "http://localhost:1181");
this.DefaultRequestHeaders.Referrer = new Uri("http://localhost:1181/Provisioner/Edit/1");
//this.PostAsync<RequestModel<string>>(address + "PostLogOn", request, new media JsonMediaTypeFormatter())
this.PostAsync<RequestModel<string>>(address + "PostLogOn", request, new XmlMediaTypeFormatter())
.ContinueWith(
(postTask) =>
{
postTask.Result.Content.ReadAsAsync<string>().ContinueWith(
(readTask) =>
{
myvalue = readTask.Result;
}).Wait();
}).Wait();
jquery呼び出しコード:
jQuery.support.cors = true;
$.ajax({
type: 'POST',
url: 'http://me.mywebsite.com/provisioning/api/provisioning/PostLogOn',
datatype: 'json',
data: { datum: 'this is my data' },
success: function (data) {
alert(data);
},
error: function (data) {
alert(data);
}
});
私が本当にイライラしたのは、jqueryを使用して同じ呼び出しを行うと、コントローラーアクションを開始できるように見えることです(それでもエラーが発生しますが、HTMLからRequestModel<>を有効な方法でフォーマットできないためです。ページにアクセスし、メソッドを正常に入力した後、解析例外を受け取ります)
Chromeからのjqueryリクエスト:
POST /provisioning/api/provisioning/PostLogOn HTTP/1.1
Host: me.mywebsite.com
Connection: keep-alive
Content-Length: 21
Origin: http://localhost:1181
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.4 (KHTML, like Gecko) Chrome/22.0.1229.92 Safari/537.4
Content-Type: application/x-www-form-urlencoded
Accept: */*
Referer: http://localhost:1181/Provisioner/Edit/1
Accept-Encoding: gzip,deflate,sdch
Accept-Language: en-US,en;q=0.8
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3
.net HttpClientリクエスト:
POST /provisioning/api/provisioning/PostLogOn HTTP/1.1
Accept: application/json
Origin: http://localhost:1181
Referer: http://localhost:1181/Provisioner/Edit/1
Content-Type: application/xml; charset=utf-8
Host: me.mywebsite.com
Content-Length: 420
Expect: 100-continue
Connection: Keep-Alive
そして、良い尺度として、私が受け取る応答(jqueryと.netの唯一の違いはサイズです)
HTTP/1.1 500 Internal Server Error
Cache-Control: no-cache
Pragma: no-cache
Content-Type: application/json; charset=utf-8
Expires: -1
Server: Microsoft-IIS/7.5
Access-Control-Allow-Origin: http://localhost:1181
X-AspNet-Version: 4.0.30319
X-Powered-By: ASP.NET
Date: Wed, 10 Oct 2012 06:34:46 GMT
Content-Length: 823
コントローラまたはアクションに認証属性がありません。セッションキーを持っていますが、フレームワークに統合されておらず、RequestModel<>の一部としてのデータにすぎません。VSからデバッグモードでアプリを実行すると、すべてが正常に機能します。これは、WebAPIを自分のWebサイトに展開した後にのみ発生します。cors OriginハンドラーをAPI構成のスタートアップに追加した後、jQuery呼び出しが機能し始めました。これは、これがクロスドメインの問題であると思わせますが、.netコードには同じoriginヘッダーがあります...私が見ている最大の違いは、 jsonデータ型を指定しても、ajax呼び出しは最終的にform-urlencodedとしてフォーマットします。.netからjsonとxmlの両方を試しましたが、役に立ちませんでした。UrlEncodedMediaTypeFormatterも試しましたが、データをシリアル化するほど賢くないようです。興味深いことに、テストアクションでブラウザのURLバーから単純なGETを試してみると、応答も得られます。どういうわけか、jQuery.support.cors = trueのようにドメイン間を移動することをHttpClientに通知する必要がありますか?
Googleのスキルと個人的な知識の限界に達したので、提案や洞察をいただければ幸いです。