2

以下のように ajax を使用して wcf 関数を呼び出そうとしています:

$.ajax({
        url:http://localhost:64121/Test.svc/json/GetNumber?X='+ var1 + '&callback=?',
        dataType: 'json',
        beforeSend : function(xhr) {
            xhr.setRequestHeader("Authorization", "BasicAuthTest");
        },
        success: function(trackingData) {
            alert("success");
        }
    });

WCFコードがビークしており、リクエストを受け取っています

public class CustomUserNameValidatorBasic : ServiceAuthorizationManager
    {
        protected override bool CheckAccessCore(OperationContext operationContext)
        {
            try
            {
                var msg = operationContext.RequestContext.RequestMessage;

                // If user requests standart help-page then ignore authentication check.
                if (msg.Properties.ContainsKey("HttpOperationName") && msg.Properties["HttpOperationName"].ToString() == "HelpPageInvoke")
                {

                    return base.CheckAccessCore(operationContext);
                }

                var httpRequestHeaders = ((HttpRequestMessageProperty) msg.Properties[HttpRequestMessageProperty.Name]).Headers;

                // Is Authorization-header contained in http-headers?
                if (!httpRequestHeaders.AllKeys.Contains(HttpRequestHeader.Authorization.ToString()))
                {
                    //code returns here
                    return false;
                }

                    return false;

            }
            catch (Exception e)
            {
                return false;
            }

        }
    }

示されているように、「Authorization」ヘッダーは req ヘッダー配列に含まれていません

ここに画像の説明を入力

ajax reqeuestのリクエストヘッダーの下のFirebug:

Request Headersview source Accept / Accept-Encoding gzip, deflate
Accept-Language en-US,en;q=0.5 Cache-Control max-age=0
接続 キープアライブ ホスト test.proxyU.com If-Modified-Since Wed, 21 Mar 2012 19:46:56 GMT If-None-Match "e0818-17278-4bbc60dc86c00"
User-Agent Mozilla/5.0 (Windows NT 6.1; WOW64; rv:16.0)
Gecko/20100101 Firefox/16.0

更新:以下の回答を考慮して、以下の3つの方法を試しましたが、いずれもヘッダーを追加しません。すべてが wcf を正しく呼び出しますが、「Authorization」ヘッダーが要求に含まれていません。そして、http リクエストを見ると、ヘッダーは上に投稿したスクリーンショットに非常によく似ています

方法 1

$.ajax({
        url: "http://localhost:64121/Test.svc/json/GetNumber?X='+ var1 + '&callback=?'",
        beforeSend: function(xhr){xhr.setRequestHeader("Authorization", "BasicAuthTest");},
        success: function(trackingData) {
            alert("success");
        }
    });

方法 2

$.ajax({
        url: "http://localhost:64121/Test.svc/json/GetNumber?X='+ var1 + '&callback=?'",
        headers: {"Authorization": "BasicAuthTest"},
        success: function(trackingData) {
            alert("success");
        }
    });

方法 3

$.ajax({
        url: "http://localhost:64121/Test.svc/json/GetNumber?X='+ var1 + '&callback=?'",
        beforeSend : function(xhr, settings) {
            $.extend(settings, { headers : { "Authorization" : "BasicAuthTest" } });
        },
        success: function(trackingData) {
            alert("success");
        }
    });
4

2 に答える 2

1

setRequestHeader()のドキュメントから

open() の後、send() の前に setRequestHeader() を呼び出す必要があります。

jQuery のソースを見ると、send() で open() が呼び出されているため、beforeSend() の xhr オブジェクトを介してヘッダーを設定することはできません。

ヘッダーに関する $.ajax の jQuery ドキュメントには、次のように記載されています。

この設定は beforeSend 関数が呼び出される前に設定されます。したがって、ヘッダー設定の値は beforeSend 関数内から上書きできます。

したがって、設定オブジェクトを介して beforeSend(xhr, settings) のヘッダーを更新すると、jQuery がそれらを取得します。

$.ajax({
    url:http://localhost:64121/Test.svc/json/GetNumber?X='+ var1 + '&callback=?',
    dataType: 'json',
    beforeSend : function(xhr, settings) {
        $.extend(settings, { headers : { "Authorization", "BasicAuthTest" } }
    },
    success: function(trackingData) {
        alert("success");
    }
});

または、headers パラメータを $.ajax() 呼び出しに渡すこともできます。

$.ajax({
    url: ...,
    headers : { "Authorization", "BasicAuthTest" }
};
于 2013-02-07T22:16:48.533 に答える
0

はい、それはクロスドメインの問題でした。私はこのVisual Studioプロジェクトテンプレートを使用しましたが、これにより作業がかなり簡単になりました。http get fromtheserviceの実例もあります

于 2013-02-21T13:56:55.257 に答える