将请求头添加到jQueryAjax调用会引发101异常

将请求头添加到jQueryAjax调用会引发101异常,jquery,ajax,wcf,rest,header,Jquery,Ajax,Wcf,Rest,Header,嗨,我在下面尽可能简化了我的代码。我试图实现的是调用restful wcf服务。然而,当我添加set-request header方法时,我在Firefox和chrome中都得到了异常,但它在IE中工作,它成功地命中了服务方法 <script src="http://code.jquery.com/jquery-1.9.1.min.js"></script> <script type="text/javascript" src="http://crypto

嗨,我在下面尽可能简化了我的代码。我试图实现的是调用restful wcf服务。然而,当我添加set-request header方法时,我在Firefox和chrome中都得到了异常,但它在IE中工作,它成功地命中了服务方法

<script src="http://code.jquery.com/jquery-1.9.1.min.js"></script>

    <script type="text/javascript" src="http://crypto-js.googlecode.com/svn/tags/3.1.2/build/rollups/hmac-md5.js"></script>
    <script type="text/javascript" src="http://crypto-js.googlecode.com/svn/tags/3.1.2/build/components/enc-base64-min.js"></script>
<script type="text/javascript">

    function WriteResponse(string) {        
        $("#divResult").val(string);
    }

    function setHeader(xhr) {
        var secretkey = "1234dgt";
        var hashedUrl = CryptoJS.HmacMD5($('#txtUrl').val(), secretkey);
        var hashedUrlBase64 = hashedUrl.toString(CryptoJS.enc.Base64);
        xhr.setRequestHeader('Authorization', hashedUrlBase64, "1234dgt");
    }

    $(document).ready(function () {
        $("#btnCall").click(function () {

            jQuery.support.cors = true;
            $.ajax({               
                url: $('#txtUrl').val(),
                type: 'GET',
                async: false,
                dataType: 'json',
                success: function (data) {
                    WriteResponse(data);
                },
                error: function (x, y, z) {
                    alert(x + '\n' + y + '\n' + z);
                },
                beforeSend: setHeader
            });
        });
    });

</script>

函数WriteResponse(字符串){
$(“#divResult”).val(字符串);
}
函数setHeader(xhr){
var secretkey=“1234dgt”;
var hashedUrl=CryptoJS.HmacMD5($('#txtrl').val(),secretkey);
var hashedUrlBase64=hashedUrl.toString(CryptoJS.enc.Base64);
xhr.setRequestHeader('Authorization',hashedrlbase64,“1234dgt”);
}
$(文档).ready(函数(){
$(“#btnCall”)。单击(函数(){
jQuery.support.cors=true;
$.ajax({
url:$('#txtrl').val(),
键入:“GET”,
async:false,
数据类型:“json”,
成功:功能(数据){
写响应(数据);
},
错误:函数(x,y,z){
警报(x+'\n'+y+'\n'+z);
},
发送前:setHeader
});
});
});
任何帮助都将不胜感激。
谢谢

//下面是用于调用同一服务的c代码:
公共静态字符串GetUserBookmarks(字符串uri)
{
HttpWebRequest-request=WebRequest.Create(uri)为HttpWebRequest;
字符串encodedUri=EncodeText(_key,uri,UTF8Encoding.UTF8);
request.Headers[HttpRequestHeader.Authorization]=encodedUri;
HttpWebResponse=request.GetResponse()作为HttpWebResponse;
Stream bookmarksStream=response.GetResponseStream();
StreamReader=新的StreamReader(bookmarksStream);
string str=reader.ReadToEnd();
reader.Close();
bookmarksStream.Close();
返回str;
}
公共静态字符串编码文本(字符串键、字符串文本、编码)
{
HMACMD5 HMACMD5=新的HMACMD5(encoding.GetBytes(key));
byte[]textBytes=encoding.GetBytes(文本);
byte[]encodedTextBytes=
hmacMD5.ComputeHash(textBytes);
字符串编码文本=
Convert.tobase64字符串(encodedTextBytes);
返回编码文本;
}
//以下是wcf服务方法及其接口\契约
[服务合同]
公共接口IRestSerivce
{
[WebGet(UriTemplate=“users/{username}”)]
[经营合同]
列出GetUserBookmarks(字符串用户名);
}
公共列表GetUserBookmarks(字符串用户名)
{
WebOperationContext上下文=WebOperationContext.Current;
OutgoingWebResponseContext outgoingResponseContext=
背景、支出反应;
bool isUserAuthenticated=isUserAuthenticated(用户名);
if(isUserAuthenticated==false)
{
outgoingResponseContext.StatusCode=HttpStatusCode.Unauthorized;
返回null;
}
outgoingResponseContext.StatusCode=HttpStatusCode.OK;
列表书签=新列表();
bookmarks.Add(“用户已成功通过身份验证”);
返回书签;
}
这是我收到的错误,这是ajax错误函数中产生的警报,但是firbug控制台窗口中没有错误

[对象] 错误
[Exception…”“Failure”nsresult:“0x80004005(NS_ERROR_Failure)”位置:“JS frame:::.send::line 5”数据:否]

请看一看,我认为它演示了您正在尝试实现的目标


我认为您向setRequestHeader传递的参数太多。

我最终发现代码存在问题,原因是服务器端不允许使用授权头。因此,为了解决这个问题,我需要在我的wcf项目的global.asac.cs类中添加一些代码。下面的代码还支持跨域调用

    protected void Application_BeginRequest(object sender, EventArgs e)
    {

        HttpContext.Current.Response.Cache.SetCacheability(HttpCacheability.NoCache);
        HttpContext.Current.Response.Cache.SetNoStore();

        EnableCrossDmainAjaxCall();
    }

    private void EnableCrossDmainAjaxCall()
    {
        HttpContext.Current.Response.AddHeader("Access-Control-Allow-Origin",
                      "*");

        if (HttpContext.Current.Request.HttpMethod == "OPTIONS")
        {
            HttpContext.Current.Response.AddHeader("Access-Control-Allow-Methods",
                          "GET, POST");
            HttpContext.Current.Response.AddHeader("Access-Control-Allow-Headers",
                          "Content-Type, Accept, Authorization");
            HttpContext.Current.Response.AddHeader("Access-Control-Max-Age",
                          "1728000");
            HttpContext.Current.Response.End();
        }
    }

感谢Nikolaos的帮助。

Hi,很遗憾,删除setRequestHeader方法的第二个或第三个参数会产生相同的错误。您能否通过其他方式(例如通过小型C#console应用程序)成功调用该服务?因此,你可以消除任何其他问题,如错误的盐或类似的琐碎问题。你好,尼古拉斯,是的,我可以通过c#console应用程序称该服务为罚款。我可以给你发送代码样本。我有一个wcf restful服务被c#控制台应用程序调用,也可以通过web应用程序调用。如果我删除set header方法,它可以正常工作。我在网上找不到任何关于这个问题的帮助。你在C#app中以同样的方式生成授权头?用一个密钥对目标URL进行MD5哈希,然后对整个URL进行base64?您还可以尝试使用headers属性,而不是使用beforeSend函数。查看第二个答案嗨,你有我可以发送给你的电子邮件吗?
    protected void Application_BeginRequest(object sender, EventArgs e)
    {

        HttpContext.Current.Response.Cache.SetCacheability(HttpCacheability.NoCache);
        HttpContext.Current.Response.Cache.SetNoStore();

        EnableCrossDmainAjaxCall();
    }

    private void EnableCrossDmainAjaxCall()
    {
        HttpContext.Current.Response.AddHeader("Access-Control-Allow-Origin",
                      "*");

        if (HttpContext.Current.Request.HttpMethod == "OPTIONS")
        {
            HttpContext.Current.Response.AddHeader("Access-Control-Allow-Methods",
                          "GET, POST");
            HttpContext.Current.Response.AddHeader("Access-Control-Allow-Headers",
                          "Content-Type, Accept, Authorization");
            HttpContext.Current.Response.AddHeader("Access-Control-Max-Age",
                          "1728000");
            HttpContext.Current.Response.End();
        }
    }