1

私はこれを一日中叩いてきました、そしてそれはいくつかの助けを得る時です。いくつかの.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のスキルと個人的な知識の限界に達したので、提案や洞察をいただければ幸いです。

4

2 に答える 2

1

問題を解決できました。tugberkは、私のコードに問題があったという点で正しいです。私の元のクロスドメインの仮定は正しかったのですが、corsメッセージハンドラーをAPI構成に追加すると、問題が解決され、最終的にエラーメッセージを受け取ることができたのです。

無効な資格情報を取得した理由は、開発マシンで実行したときに接続文字列ルックアップ(レジストリ)を使用できたが、IISサーバーに展開した後は使用できなかったためです。完全に構成されたベータ環境へのデプロイは成功しました。私の混乱は、最初のクロスドメインの問題と14時間の問題の診断に起因していました。

于 2012-10-10T18:04:12.690 に答える
1

または、メソッドまたは API コントローラーから authorize 属性を削除するか、API メソッドに allowAnonymous 属性を追加します。

[AllowAnonymous]
[HttpPost]
public HttpResponseMessage PostLogOn(string datum)
{
   return Request.CreateResponse(HttpStatusCode.OK);
}
于 2015-11-18T07:39:51.863 に答える