WCF 处理 CORS 和选项 VERB
WCF handling CORS & Options VERB
我在 IIS 上托管了一个 wcf 服务。
几乎所有文档都说要启用 cors,您应该处理 OPTIONS VERB。 (Pre-Flight 个请求)
我有一个方法,其签名是:
[OperationContract]
[FaultContract(typeof(ExceptionManager))]
[WebInvoke(Method = "POST",
RequestFormat = WebMessageFormat.Json,
ResponseFormat = WebMessageFormat.Json,
BodyStyle = WebMessageBodyStyle.WrappedRequest,
UriTemplate = "PostLog")]
string PostLog(List<LoginEntry> LoginLog);
我创建了一个派生自 IServiceBehavior 的属性并将此 Class 连接到我的服务并处理 BeforeSendReply 方法以添加访问控制方法,如下所示:
public void BeforeSendReply(ref System.ServiceModel.Channels.Message reply, object correlationState)
{
var httpHeader = reply.Properties["httpResponse"] as HttpResponseMessageProperty;
httpHeader.Headers.Add("Access-Control-Allow-Origin", "*");
httpHeader.Headers.Add("Access-Control-Request-Method", "POST,GET,PUT,DELETE,OPTIONS");
httpHeader.Headers.Add("Access-Control-Allow-Headers", "X-Requested-With,Content-Type");
}
当我在 Firefox 中创建测试调用时,这对我没有帮助。所以我把它从这里拿出来并添加到 Global.asax 文件中作为
protected void Application_BeginRequest(object sender, EventArgs e)
{
HttpContext.Current.Response.Cache.SetCacheability(HttpCacheability.NoCache);
HttpContext.Current.Response.Cache.SetNoStore();
HttpContext.Current.Response.AddHeader("Access-Control-Allow-Origin", "*");
if (HttpContext.Current.Request.HttpMethod == "OPTIONS")
{
HttpContext.Current.Response.AddHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS");
HttpContext.Current.Response.AddHeader("Access-Control-Allow-Headers", "Content-Type, Authorization, Accept");
HttpContext.Current.Response.AddHeader("Access-Control-Max-Age", "1728000");
HttpContext.Current.Response.End();
}
}
我可以在 firefox 中看到 403 错误并且我的 header 不存在。
所以我继续将那些 headers 放在 IIS 设置中(自定义 headers 选项卡)。 (我冒着在每个回复中发送那些的风险)。
现在我可以在 Firefox 中看到那些 header 的响应,但我仍然收到 403 错误。
这是回应 header :
HTTP/1.1 403 Forbidden
Connection: Keep-Alive
Content-Length: 1758
Date: Thu, 05 Mar 2015 14:47:25 GMT
Content-Type: text/html
Server: Microsoft-IIS/6.0
X-Powered-By: ASP.NET
Access-Control-Allow-Origin: *
Access-Control-Allow-Methods: POST, GET, OPTIONS
Access-Control-Allow-Headers: Content-Type, Authorization, Accept
我还尝试在 WebInvoke 中更改为 Method="*"。但仍然无法正常工作。
提前致谢..
所以终于开始工作了。
这个 post 帮助了我。
enabling cross-origin resource sharing on IIS7
原来问题出在 IIS 6 站点设置中。
通过以下步骤解决了它:
在 IIS 中,Select 站点 -> 右键单击(属性)->
在目录选项卡下 Select 配置按钮。
在 映射选项卡下。 搜索扩展名 (.svc)
单击编辑。搜索标签 "Limit Verbs To".
之前的值为 "GET,HEAD,POST,DEBUG"
替换为"GET,HEAD,POST,DEBUG,OPTIONS"
此外,我从 IIS 中删除了所有这些 headers 配置(因为我已经在管理它们 Global.asax)。
我在 IIS 上托管了一个 wcf 服务。 几乎所有文档都说要启用 cors,您应该处理 OPTIONS VERB。 (Pre-Flight 个请求)
我有一个方法,其签名是:
[OperationContract]
[FaultContract(typeof(ExceptionManager))]
[WebInvoke(Method = "POST",
RequestFormat = WebMessageFormat.Json,
ResponseFormat = WebMessageFormat.Json,
BodyStyle = WebMessageBodyStyle.WrappedRequest,
UriTemplate = "PostLog")]
string PostLog(List<LoginEntry> LoginLog);
我创建了一个派生自 IServiceBehavior 的属性并将此 Class 连接到我的服务并处理 BeforeSendReply 方法以添加访问控制方法,如下所示:
public void BeforeSendReply(ref System.ServiceModel.Channels.Message reply, object correlationState)
{
var httpHeader = reply.Properties["httpResponse"] as HttpResponseMessageProperty;
httpHeader.Headers.Add("Access-Control-Allow-Origin", "*");
httpHeader.Headers.Add("Access-Control-Request-Method", "POST,GET,PUT,DELETE,OPTIONS");
httpHeader.Headers.Add("Access-Control-Allow-Headers", "X-Requested-With,Content-Type");
}
当我在 Firefox 中创建测试调用时,这对我没有帮助。所以我把它从这里拿出来并添加到 Global.asax 文件中作为
protected void Application_BeginRequest(object sender, EventArgs e)
{
HttpContext.Current.Response.Cache.SetCacheability(HttpCacheability.NoCache);
HttpContext.Current.Response.Cache.SetNoStore();
HttpContext.Current.Response.AddHeader("Access-Control-Allow-Origin", "*");
if (HttpContext.Current.Request.HttpMethod == "OPTIONS")
{
HttpContext.Current.Response.AddHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS");
HttpContext.Current.Response.AddHeader("Access-Control-Allow-Headers", "Content-Type, Authorization, Accept");
HttpContext.Current.Response.AddHeader("Access-Control-Max-Age", "1728000");
HttpContext.Current.Response.End();
}
}
我可以在 firefox 中看到 403 错误并且我的 header 不存在。 所以我继续将那些 headers 放在 IIS 设置中(自定义 headers 选项卡)。 (我冒着在每个回复中发送那些的风险)。 现在我可以在 Firefox 中看到那些 header 的响应,但我仍然收到 403 错误。 这是回应 header :
HTTP/1.1 403 Forbidden
Connection: Keep-Alive
Content-Length: 1758
Date: Thu, 05 Mar 2015 14:47:25 GMT
Content-Type: text/html
Server: Microsoft-IIS/6.0
X-Powered-By: ASP.NET
Access-Control-Allow-Origin: *
Access-Control-Allow-Methods: POST, GET, OPTIONS
Access-Control-Allow-Headers: Content-Type, Authorization, Accept
我还尝试在 WebInvoke 中更改为 Method="*"。但仍然无法正常工作。
提前致谢..
所以终于开始工作了。 这个 post 帮助了我。
enabling cross-origin resource sharing on IIS7
原来问题出在 IIS 6 站点设置中。
通过以下步骤解决了它:
在 IIS 中,Select 站点 -> 右键单击(属性)->
在目录选项卡下 Select 配置按钮。
在 映射选项卡下。 搜索扩展名 (.svc) 单击编辑。搜索标签 "Limit Verbs To".
之前的值为 "GET,HEAD,POST,DEBUG"
替换为"GET,HEAD,POST,DEBUG,OPTIONS"
此外,我从 IIS 中删除了所有这些 headers 配置(因为我已经在管理它们 Global.asax)。