setRequestHeader没有向wcf调用添加请求标头

时间:2013-02-07 20:58:19

标签: 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;
            }

        }
    }

如图所示,“授权”标题不包含在req标题数组

enter image description here

在针对ajax请求的请求标题下的Firebug中:

  

请求Headersview源   接受 / Accept-Encoding gzip,deflate
  Accept-Language en-US,en; q = 0.5 Cache-Control max-age = 0
  连接keep-alive主机test.proxyU.com If-Modified-Since Wed,21   2012年3月19:46:56 GMT If-None-Match“e0818-17278-4bbc60dc86c00”
  用户代理Mozilla / 5.0(Windows NT 6.1; WOW64; rv:16.0)
  Gecko / 20100101 Firefox / 16.0

更新:考虑到下面的答案,我尝试了3种方法,如下所示,没有一个添加标题。所有调用wcf都正确但“授权”标题不在请求中。如果我看到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");
        }
    });

2 个答案:

答案 0 :(得分:1)

来自setRequestHeader()

的文档
  

你必须在open()之后但在send()之前调用setRequestHeader()。

查看jQuery source,在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" }
};

答案 1 :(得分:0)

是的,这是一个跨域问题,我使用this visual studio项目模板,它使事情变得相当容易。对于http来自服务

,也有一个工作示例