一个 WCF 调用而不是另一个 WCF 调用的 CORS 问题?
Posted
技术标签:
【中文标题】一个 WCF 调用而不是另一个 WCF 调用的 CORS 问题?【英文标题】:CORS issue with one WCF call but not another? 【发布时间】:2020-02-22 02:45:23 【问题描述】:我们有两个使用两个 WCF 调用的 html 页面。两种 WCF 方法都在同一个项目下,部署时在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>
[OperationContract]
看起来像这样:
[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();
两个 HTML 页面也在同一服务器中,但端口不同 (http://MyServer:93
)。
GetData()
由带有 AM Charts javascript 控件的 HTML 调用。调用看起来像这样,并且在过去几个月中运行良好:
"dataLoader":
"url": "http://MyServer:89/Service1.svc/GetData",
就在今天,我为另一个 HTML 页面创建了 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);
);
第二个电话给了我 CORS 问题,特别是以下错误:
Access to XMLHttpRequest at
'http://MyServer:89/Service1.svc/GetMoreData' from origin
'http://MyServer:93' has been blocked by CORS policy: Response to preflight
request doesn't pass access control check: It does not have HTTP ok status.
解决方案是为 Web 调用方法添加通配符,而不仅仅是 GET
:
[OperationContract]
[WebInvoke(Method = "*", ResponseFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.WrappedRequest,
UriTemplate = "GetMoreData")]
System.IO.Stream GetMoreData();
我的问题:为什么一个会有这个 CORS 问题,而另一个却没有,因为它们都在同一个 IP:Port 下?
【问题讨论】:
嗯。并非所有请求都会触发 CORS 飞行前请求。请参阅MDN: CORS(向下滚动到“简单请求”)。我怀疑第一个请求是一个简单的请求,但第二个不是,虽然我不确定请求之间的区别是什么。 您的第一个请求是否以同样的方式提出?您正在指定contentType: "application/json",
,这不是“简单请求”允许的标头值之一。如果第一个请求没有那个标头,那可能是不同的。
【参考方案1】:
如何发送第一个请求?可能与此 JS 调用有所不同。 此外,请尝试以下 CORS 问题的解决方案。我们必须处理 OPTION 请求。请将以下代码添加到 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>
如果有什么我可以帮忙的,请随时告诉我。
【讨论】:
以上是关于一个 WCF 调用而不是另一个 WCF 调用的 CORS 问题?的主要内容,如果未能解决你的问题,请参考以下文章