Javascript 一次WCF呼叫而不是另一次的CORS问题?
我们有两个HTML页面,它们使用两个WCF调用。两种WCF方法都在同一个项目下,部署时在Javascript 一次WCF呼叫而不是另一次的CORS问题?,javascript,wcf,cors,wcf-data-services,Javascript,Wcf,Cors,Wcf Data Services,我们有两个HTML页面,它们使用两个WCF调用。两种WCF方法都在同一个项目下,部署时在http://MyServer:89。自从web.config具有以下功能以来,我们对CORS没有任何问题: <httpProtocol> <customHeaders> <add name="Access-Control-Allow-Origin" value="*"/> <add name="Access-Control-Allow-Metho
http://MyServer:89
。自从web.config
具有以下功能以来,我们对CORS没有任何问题:
<httpProtocol>
<customHeaders>
<add name="Access-Control-Allow-Origin" value="*"/>
<add name="Access-Control-Allow-Methods" value="GET, POST, OPTIONS, PUT" />
<add name="Access-Control-Allow-Headers" value="Content-Type, Accept"/>
</customHeaders>
两个HTML页面也位于同一服务器中,但端口不同(http://MyServer:93
)
GetData()
由带有javascript控件的HTML调用。这个电话看起来像这样,在过去的几个月里一直运作良好:
"dataLoader": {
"url": "http://MyServer:89/Service1.svc/GetData",
就在今天,我为另一个HTML页面创建了GetMoreData()
。函数调用如下所示:
[OperationContract]
[WebInvoke(Method = "GET", ResponseFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.WrappedRequest,
UriTemplate = "GetData")]
System.IO.Stream GetData();
[OperationContract]
[WebInvoke(Method = "GET", ResponseFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.WrappedRequest,
UriTemplate = "GetMoreData")]
System.IO.Stream GetMoreData();
var serviceUri = "http://MyServer:89/Service1.svc/GetMoreData";
$.ajax({
type: "GET",
contentType: "application/json",
url: serviceUri,
dataType: "json",
success:
function (response) {
showPresidentsList(response);
$('#message').html("<a href=" + serviceUri + ">" + serviceUri + "</a>");
},
error:
function (err) {
alert(err);
}
});
解决方案是为web invoke方法添加一个通配符,而不仅仅是GET
:
[OperationContract]
[WebInvoke(Method = "*", ResponseFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.WrappedRequest,
UriTemplate = "GetMoreData")]
System.IO.Stream GetMoreData();
我的问题:为什么一个有这个CORS问题,而另一个没有,因为它们都在同一个IP:端口下?如何发送第一个请求?可能与此JS调用有所不同。
此外,请尝试以下CORS问题的解决方案。我们必须处理选项请求。请将以下代码添加到Global.asax文件中
protected void Application_BeginRequest(object sender, EventArgs e)
{
if (Request.Headers.AllKeys.Contains("Origin") && Request.HttpMethod == "OPTIONS")
{
Response.End();
}
}
还有网络配置
<httpProtocol>
<customHeaders>
<add name="Access-Control-Allow-Origin" value="*"/>
<add name="Access-Control-Allow-Headers" value="content-type" />
<add name="Access-Control-Allow-Methods" value="GET,POST,PUT,DELETE,OPTIONS" />
</customHeaders>
</httpProtocol>
如果有什么我可以帮忙的,请随时告诉我。Hmm。并非所有请求都会触发CORS飞行前请求。请参阅(向下滚动至“简单请求”)。我怀疑第一个请求是一个简单的请求,但第二个请求不是,尽管我不确定两个请求之间的区别。您的第一个请求也是这样做的吗?您正在指定
contentType:“application/json”,
,这不是允许的“简单请求”头值之一。如果第一个请求没有该头,那么可能就是不同之处。
<httpProtocol>
<customHeaders>
<add name="Access-Control-Allow-Origin" value="*"/>
<add name="Access-Control-Allow-Headers" value="content-type" />
<add name="Access-Control-Allow-Methods" value="GET,POST,PUT,DELETE,OPTIONS" />
</customHeaders>
</httpProtocol>