Access-Control-Allow-Headers不允许请求标头字段x-user-session

时间:2013-10-30 05:16:29

标签: c# wcf cors

我正在尝试对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

3 个答案:

答案 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();
        }
    }
}

我没有尝试过代码,它可能无法运行,但我希望这个想法很明确:)