Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/369.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 一次WCF呼叫而不是另一次的CORS问题?_Javascript_Wcf_Cors_Wcf Data Services - Fatal编程技术网

Javascript 一次WCF呼叫而不是另一次的CORS问题?

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

我们有两个HTML页面,它们使用两个WCF调用。两种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>
两个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>