我正在尝试对IIS7.5上托管的WCF服务端点进行CORS调用。
我在IIS中配置了自定义标头。我的配置如下所示
<customHeaders>
<add name="Access-Control-Allow-Methods" value="GET,PUT,POST,DELETE,OPTIONS" />
<add name="Access-Control-Allow-Headers" value="x-user-session,origin, content-type, accept" />
<add name="Access-Control-Allow-Credentials" value="true" />
</customHeaders>
当我发出POST请求时,我收到以下错误消息 “Access-Control-Allow-Headers”不允许“请求标头字段x-user-session”
如果我从通话中删除我的自定义标题并运行它,一切正常。
此外,如果我使用自定义标头进行GET调用,那么API也能正常工作。
$.ajax({
type:"POST",
success: function(d) { console.log(d) },
timeout: 9000,
url: "http://api.myserver.com/Services/v2/CreditCard.svc/update_cc_detail",
data: JSON.stringify({"card_id": 1234,"expire_month":"11","expire_year":"2020","full_name":"Demo Account", "number":"4111111111111111","is_primary":true}),
xhrFields: { withCredentials: true},
headers: { x-user-session': "B23680D0B8CB5AFED9F624271F1DFAE5052085755AEDDEFDA3834EF16115BCDDC6319BD79FDCCB1E199BB6CC4D0C6FBC9F30242A723BA9C0DFB8BCA3F31F4C7302B1A37EE0A20C42E8AFD45FAB85282FCB62C0B4EC62329BD8573FEBAEBC6E8269FFBF57C7D57E6EF880E396F266E7AD841797792619AD3F1C27A5AE" },
crossDomain: true,
contentType: 'application/json'
});
以下是FireBug日志的链接 https://gist.github.com/anonymous/7333130
答案 0 :(得分:4)
问题很可能是OPTIONS
请求返回错误(404或405)。这可以解释为什么GET
正常工作(它并不总是需要预检请求)而POST
没有(它总是需要预检)。
通常,在IIS上托管的WCF服务最简单的解决方案是通过WebInvokeAttribute
启用所有方法:
[WebInvoke(Medthod="*")]
...
有时,IIS会使用默认OPTION
阻止OPTIONSVerbHandler
请求。您可以通过web.config删除此处理程序:
<handlers>
<remove name="OPTIONSVerbHandler"/>
</handlers>
在最坏的情况下(当OPTIONS
未被IIS阻止但无法由WCF处理时),您可以设置自己的处理程序。在这种情况下,首先需要一个简单的类,如下面的程序集中的那个:
namespace CustomHandlers
{
public class CORSOPTIONSVerbHandler : IHttpHandler
{
public bool IsReusable
{
get { return true; }
}
public void ProcessRequest(HttpContext context)
{
if (context.Response.HttpMethod == "OPTIONS")
context.Response.StatusCode = 200;
else
context.Response.StatusCode = 405;
context.Response.End();
}
}
}
可以在web.config中添加新的处理程序,如下所示:
<handlers>
<remove name="OPTIONSVerbHandler"/>
<add name="CORSOPTIONSVerbHandler" verb="OPTIONS" path="*" type="CustomHandlers.CORSOPTIONSVerbHandler, CustomHandlers"/>
</handlers>
当然,您需要正确调整程序集,命名空间和类名。
答案 1 :(得分:0)
尝试将这些添加到您的web.config
<add name="Access-Control-Allow-Origin" value="*" />
<add name="Access-Control-Allow-Headers" value="Origin, X-Requested-With, Content-Type, Accept" />
通常是因为跨源请求
答案 2 :(得分:0)
我遇到了类似的问题,但是有了服务堆栈,为了正确地让你的服务回答OPTIONS请求,你需要自己明确地放置标题。也许在WCF中没有必要,但我会尝试。
使用tpeczek的代码:
namespace CustomHandlers
{
public class CORSOPTIONSVerbHandler : IHttpHandler
{
public bool IsReusable
{
get { return true; }
}
public void ProcessRequest(HttpContext context)
{
if (context.Response.HttpMethod == "OPTIONS")
context.Response.StatusCode = 200;
context.Response.Headers.Add("Access-Control-Allow-Headers" ,"x-user-session,origin, content-type, accept");
else
context.Response.StatusCode = 405;
context.Response.End();
}
}
}
我没有尝试过代码,它可能无法运行,但我希望这个想法很明确:)