2017-04-13 71 views
0

我有一个在Azure上托管的ASP.NET Web API。我已将HTTP消息处理程序集成到该API。当我使用AJAX调用它时,消息处理程序正在被击中。我也在我的AJAX调用中发送一些请求头。问题是我没有收到从AJAX调用发送到集成在Web API中的Message Handler的头文件。请参阅图像:Debugger screenshot无法从ASP.NET Web API中的jQuery AJAX请求中获取标头

下面是我的AJAX请求的代码:

$.ajax({ 
    url: "https://someservicename.azurewebsites.net/Service/RequestHandler", 
    beforeSend: function (xhr) { 
     xhr.setRequestHeader('Token', '86810e135958961ad4880ad'); 
    }, 
    type: "POST", 
    crossDomain: true, 
    data: { 
     param: "Passed Parameter" 
    }, 
    success: function (msg) { 
     console.log(msg); 
    }, 
    error: function (XMLHttpRequest, textStatus, errorThrown) { 
     console.log(textStatus); 
    } 
}); 

中的Web API的消息处理程序看起来象下面这样:

protected async override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) 
{ 
    string authToken; 
    try 
    { 
     authToken = request.Headers.GetValues("Token").FirstOrDefault(); 

     if (authToken != "86810e135958961ad4880ad") 
     { 

      return await Task.Factory.StartNew(() => 
      { 
       return new HttpResponseMessage(HttpStatusCode.BadRequest) 
       { 
        Content = new StringContent("Unauthorized access!") 
       }; 
      }); 
     } 
     else 
     { 
      return await base.SendAsync(request, cancellationToken); 
     } 
    } 
    catch (System.InvalidOperationException) 
    { 
     return null; 
    } 
} 

当我从IIS中运行的代码本地主机发送的请求如下所示:

Accept:*/* 
Accept-Encoding:gzip, deflate, sdch, br 
Accept-Language:en-US,en;q=0.8 
Access-Control-Request-Headers:token 
Access-Control-Request-Method:POST 
Connection:keep-alive 
Host:someservicename.azurewebsites.net 
Origin:http://localhost:12522 
Referer:http://localhost:12522/pocppd.html 
User-Agent:Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.133 Safari/537.36 

而负责人我在控制台上得到的是:

https://someservicename.azurewebsites.net/Service/RequestHandler. Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost:12522' is therefore not allowed access. The response had HTTP status code 500. 

与POSTMAN客户端请求工作正常,但从本地主机它会返回一个错误。请让我知道没有在我的消息处理程序中获取标题的原因?

+0

响应哪位会带来几十[结果](https://www.google.com.tr/search?q=Response+to+preflight+request+doesn %27吨+传+访问+对照+检查%3A + NO +%27Access - 控制 - 允许来源%27&OQ =响应+至+预检+请求+没有按%27吨+传+访问+对照+检查%3A + NO +%27Access -Control-Allow-Origin%27&aqs = chrome..69i57j69i59.119j0j7&sourceid = chrome&ie = UTF-8)在搜索时只是告诉你,服务器上不允许使用哪个请求的来源,因为CORS标准。 Marius的回答是一种使服务器响应来自你本地主机的请求的方法。 – ibubi

回答

1

你必须在你的web.config添加这个(因为你需要,你可以更改值):

<httpProtocol> 
     <customHeaders> 
      <add name="Access-Control-Allow-Origin" value="*" /> 
      <add name="Access-Control-Allow-Headers" value="Origin, X-Requested-With, Content-Type, Accept, Authorization, Token" /> 
      <add name="Access-Control-Allow-Methods" value="GET, POST, PUT, DELETE" /> 
     </customHeaders> 
    </httpProtocol> 

请求前,一个OPTIONS请求被发送,以确保您被允许执行请求。正如错误所述,“对预检请求的响应不会通过访问控制检查:否请求的资源上存在'Access-Control-Allow-Origin'标头。”在Web.config中添加上面的行将传递所需的标题。

MDN表示:“与上面讨论的简单请求不同,”preflighted“请求首先向另一个域上的资源发送HTTP OPTIONS请求头,以确定实际请求是否安全发送。现场请求是这样预先显示的,因为它们可能会影响用户数据。“

+0

我在web.config中添加了上面的内容,但仍面临同样的问题......它突破了预检请求...... AJAX以“Access-Control-Request-Headers:授权”的形式发送头信息_without_其值 –

+0

Thanks @Marius ,我发现我的请求是预冲的,它没有携带自定义头文件,当发送预检后的实际请求被发送时,自定义头文件与它一起发送! –

+0

我很高兴听到您设法修复它。上面的 –

1

尝试在控制台此

$.ajax({ 
    url: "https://someservicename.azurewebsites.net/Service/RequestHandler", 
    headers: { 
      "Token": "86810e135958961ad4880ad" 
     },  
    type: "POST", 
    crossDomain: true, 
    data: { 
     param: "Passed Parameter" 
    }, 
    success: function (msg) { 
     console.log(msg); 
    }, 
    error: function (XMLHttpRequest, textStatus, errorThrown) { 
     console.log(textStatus); 
    } 
}); 
+0

不起作用...同样的问题 –