0

我尝试使用 ajax (xmlHttpRequest) 使用 WCF 服务 (REST)。该服务需要基本身份验证。

我的ajax调用是:

 var httpRequest = new XMLHttpRequest();
         httpRequest.onreadystatechange = function () {
             if (httpRequest.readyState == 4) {
                 if (httpRequest.status == 200) {
                     //do some stuff
                 }
             }

         };
         httpRequest.open('PUT', 'http://localhost:59000/v1/users/1', true, 'user1', 'user1');
         httpRequest.withCredentials = "true";
         //must authenticate both..in open() but also set header manually ...cf http://stackoverflow.com/questions/1358550/xmlhttp-request-basic-authentication-issue
         httpRequest.setRequestHeader('Auhtorization', 'Basic user1:user1');
         httpRequest.setRequestHeader('Accept', 'application/json');
         // overridemimeType() does not set content type header .... don't know why ?
         httpRequest.setRequestHeader('Content-Type', 'application/json');
         var params = { "UserName": "user1" };
         var requestBodyString = JSON.stringify(params);
         httpRequest.send(requestBodyString);

我首先在服务器端处理请求的方式如下

        HttpContext.Current.Response.AddHeader("Access-Control-Allow-Origin",
                      crossDomain);

        //preflight request : cf https://developer.mozilla.org/en/http_access_control 
        if (HttpContext.Current.Request.HttpMethod == "OPTIONS")
        {
            HttpContext.Current.Response.AddHeader("Access-Control-Allow-Methods",
                          "GET, POST, PUT, DELETE");
            HttpContext.Current.Response.AddHeader("Access-Control-Allow-Credentials", "true");

            HttpContext.Current.Response.AddHeader("Access-Control-Allow-Headers", "Content-Type, Authorization, Accept, DummyOneForTest");

            HttpContext.Current.Response.AddHeader("Access-Control-Max-Age",
                          "1728000");
            HttpContext.Current.Response.End();
        }

我的浏览器向我发送错误“请求标头字段授权不受 Access-Control-Allow-Headers 的允许”,但您可以看到它在响应标头中。

此外,当我尝试使用 Fiddler 时,一切都很好,我什至允许标题虚拟一个。

所以我真的很困惑,如果有人可以帮忙,请做!

谢谢

4

2 回答 2

0

明白了,在“使用 Visual Studio 开发服务器”上运行服务器时,当您尝试添加标头(第二个代码块)时抛出异常:“此操作需要 IIS 集成管道模式”。

解决方案是在应用程序配置中“使用 IIS Web 服务器”

根据此链接http://msdn.microsoft.com/en-us/library/d14azbfh.aspx#addexceptionscommand

您不能要求 Visual Studio 告诉您何时抛出异常而我错过了它。

谢谢

于 2012-05-25T08:52:52.100 回答
0

也许它不相关,但上面的 Ajax 片段也将标题名称拼错为“Authorization”而不是“Authorization”。

于 2012-05-29T19:52:14.160 回答