【问题标题】:setRequestHeader not adding request header to wcf callsetRequestHeader 未将请求标头添加到 wcf 调用
【发布时间】:2013-02-07 20:58:18
【问题描述】:

我正在尝试使用 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标头数组中

在 Firebug 的 ajax reqeuest 请求标头下:

请求标头view source 接受 / 接受编码 gzip,放气
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 2012 年 3 月 19:46:56 GMT If-None-Match "e0818-17278-4bbc60dc86c00"
用户代理 Mozilla/5.0 (Windows NT 6.1; WOW64; rv:16.0)
壁虎/20100101 火狐/16.0

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

方法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");
        }
    });

【问题讨论】:

  • 在浏览器中使用开发者工具(通常是 F12)并检查请求中是否添加了标头。
  • 我用标题更新了问题
  • @jaminator 什么版本的 jquery?
  • @drch 1.7.2,我刚刚在 chrome 调试器中注意到,当我使用方法 3 而不是添加一个全新的标头时,我看到:Access-Control-Request-Headers:accept, authorization, origin
  • 当我使用 c# 从 asp.net 网站调用这个 wcf 时,我看到一个完整的新标题条目 Authorization 正在输入,它工作正常。但从 javascript/jquery 看来,它似乎是在 Access-Control-Request-Headers 中添加标题

标签: c# jquery ajax wcf


【解决方案1】:

来自setRequestHeader()的文档

您必须在 open() 之后、send() 之前调用 setRequestHeader()。

查看jQuery source,在 send() 上调用 open(),因此您无法通过 beforeSend() 中的 xhr 对象设置标头

关于标头的 $.ajax 的 jQuery 文档说:

此设置在调用 beforeSend 函数之前设置;因此,headers 设置中的任何值都可以在 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" }
};

【讨论】:

  • 根据您的回答更新问题
【解决方案2】:

是的,这是一个跨域问题,我使用了 this Visual Studio 项目模板,它使事情变得相当容易。那里也有一个从服务获取 http 的工作示例

【讨论】:

  • 你能解释一下你做了什么来解决这个问题吗?我有完全相同的问题。
  • 只使用上面链接的项目模板,里面有工作示例
猜你喜欢
  • 2012-12-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-24
  • 1970-01-01
  • 2017-02-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多