c# - setRequestHeader 未将请求 header 添加到 wcf 调用

标签 c# jquery ajax wcf

我正在尝试使用 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;
            }

        }
    }

如图所示,“授权” header 不包含在请求 header 数组中

enter image description here

在 Firebug 下的 ajax 请求的请求 header 中:

Request Headersview source Accept / Accept-Encoding gzip, deflate
Accept-Language en-US,en;q=0.5 Cache-Control max-age=0
Connection keep-alive Host 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 都正确,但“授权” header 不在请求中。如果我看到 http 请求,标题看起来非常像我在上面发布的屏幕截图

方法一

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

方法二

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

方法三

$.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");
        }
    });

最佳答案

来自 setRequestHeader() 上的文档

You must call setRequestHeader() after open(), but before send().

查看 jQuery source , open() 在 send() 上调用,所以你不能通过 beforeSend() 中的 xhr 对象设置 header

有关 header 的 $.ajax jQuery 文档说:

This setting is set before the beforeSend function is called; therefore, any values in the headers setting can be overwritten from within the beforeSend function.

因此您可以通过设置对象更新 beforeSend(xhr, settings) 中的 header ,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");
    }
});

或者,您可以将 header 参数传递到 $.ajax() 调用中:

$.ajax({
    url: ...,
    headers : { "Authorization", "BasicAuthTest" }
};

关于c# - setRequestHeader 未将请求 header 添加到 wcf 调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14760855/

相关文章:

javascript - 如果用户尝试离开网页,如何提示用户未保存的更改

jquery - 使用 jQuery 对网页状态进行 FSM(有限状态机)建模

javascript - 将 AJAX 调用获取的数据附加到现有列表以进行延迟加载

javascript - Express Session 不适用于 Ajax 调用

c# - 使用 Parallel.Invoke 运行两个任务并添加超时以防一个任务需要更长的时间

c# Lambda 表达式,使用 Automapper 将 list<type1> 转换为 list<type2>

c# - 无法让 TinyMCE.MVC.Jquery.Sample 工作

c# - 区分多列 Entity Framework LINQ

javascript - fullcalendar 多月日历 View

javascript - AJAX POST 无法在 CODEIGNITER 中加载 div View