WCF REST服务模板40(CS)跨域错误

时间:2014-09-17 11:41:03

标签: c# asp.net web-config wcf-rest

您好我有WCF Rest服务使用(WCF REST服务模板40(CS))。我已设法让它返回Json响应。项目运行时工作正常。但是当我尝试从浏览器向服务进行Ajaxcall时,我收到错误:

  

阻止跨源请求:同源策略禁止读取   http://192.168.0.70:8001/Service/test处的远程资源。   这可以通过将资源移动到同一个域来修复   启用CORS。

和Ajax电话:

$.ajax({
        type: "POST",
        url: "http://192.168.0.70:8001/Service/test",
        contentType: "application/json; charset=utf-8",
        dataType: "json",
        async: true,
        cache: false,
        success: function (msg) {
        var Tabels = msg.d;
        alert('success');
        }
    });

这是web.config:

    <?xml version="1.0"?>
    <configuration>
      <connectionStrings>

        <add name="ConString" connectionString="SERVER=localhost;DATABASE=fabapp;UID=root;PASSWORD=;"/>
      </connectionStrings>
      <system.web>
        <compilation debug="true" targetFramework="4.0" />
      </system.web>

      <system.webServer>
<httpProtocol>
      <customHeaders>
        <add name="Access-Control-Allow-Origin" value="*" />
      </customHeaders>
    </httpProtocol>
        <modules runAllManagedModulesForAllRequests="true">
          <add name="UrlRoutingModule" type="System.Web.Routing.UrlRoutingModule, System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
        </modules>
      </system.webServer>
      <system.serviceModel>
        <serviceHostingEnvironment aspNetCompatibilityEnabled="true"/>
        <standardEndpoints>
          <webHttpEndpoint>
            <!-- 
                Configure the WCF REST service base address via the global.asax.cs file and the default endpoint 
                via the attributes on the <standardEndpoint> element below
            -->
            <standardEndpoint name="" helpEnabled="true" automaticFormatSelectionEnabled="false" defaultOutgoingResponseFormat="Json"/>
          </webHttpEndpoint>
        </standardEndpoints>
      </system.serviceModel>

    </configuration>

我尝试添加crossDomainScriptAccessEnabled =&#34; true&#34;但是当我这样做时,该服务也无法在localhost上运行。我明白了:

  

经过身份验证不支持跨域javascript回调   服务。

我需要在web.config文件中更改哪些内容?

3 个答案:

答案 0 :(得分:3)

实际上,我已经面临这个问题,我已经更进一步检查WebAPI,当我分析时,需要同样的努力。所以我必须解决这个CORS with WCF。我会尽量解释一下。开始了。当您使用CrossOrigin访问WCF请求时,例如来自不同域中的JS代码和JS,您尝试执行PUTPOST请求,第一个浏览器发送OPTION请求{{ 1}},要查看此域是否在允许列表中,那么如果您的405 HTTP Status响应WCF请求,发送带有标头值的必需响应,那么浏览器将再次执行OPTIONSPOST请求(之前发布的浏览器),它将按预期工作。

注意:您无法发送PUT,因为有一项安全功能,要求在("Access-Control-Allow-Origin", "*")而不是Access-Control-Allow-Origin中列出所需的域名。

了解更多信息 -

http://social.msdn.microsoft.com/Forums/ro-RO/5613de55-2573-49ca-a389-abacb39e4f8c/wcf-rest-service-post-cross-domain-not-working?forum=wcf

https://stackoverflow.com/questions/26163802/wcf-cors-request-from-jquery-not-working

根据实际经验,我在该标题中尝试了*,但它无效。如果你不相信我,请继续尝试。

最后代码如下。您需要将其放在*

Global.asax

答案 1 :(得分:2)

将以下内容放在wcf应用程序的global.asax文件中

protected void Application_BeginRequest(object sender, EventArgs e)
{
    HttpContext.Current.Response.AddHeader("Access-Control-Allow-Origin", "*");
    if (HttpContext.Current.Request.HttpMethod == "OPTIONS")
    {
        HttpContext.Current.Response.AddHeader("Cache-Control", "no-cache");
        HttpContext.Current.Response.AddHeader("Access-Control-Allow-Methods", "GET, POST");
        HttpContext.Current.Response.AddHeader("Access-Control-Allow-Headers", "Content-Type, Accept");
        HttpContext.Current.Response.AddHeader("Access-Control-Max-Age", "1728000");
        HttpContext.Current.Response.End();
    }
}

答案 2 :(得分:0)

您可能需要查看此链接中的帖子:

  

http://www.codeproject.com/Articles/223572/Calling-Cross-Domain-WCF-service-using-Jquery-Java

     

Ajax允许在后台获取数据而不会干扰数据   显示。通过使用XMLHttpRequest对象完成的Ajax调用允许   客户端JavaScript代码,用于建立HTTP连接。但是Ajax打电话   由于限制,不允许从跨域获取数据   浏览器强加的。请求时发出安全错误   来自另一个域的数据。避免安全错误的一种方法是   控制数据所在的远程服务器,每个请求都进入   相同的域名。这引出了一个问题,即数据有什么好处   仅来自自己的服务器?如果需要获取数据该怎么办   另一台服务器?

     

有一种方法可以摆脱这种限制 - 插入一个   Web页面中的动态脚本元素,其源是指向的   到另一个域中的服务URL并获取脚本中的数据   本身。当脚本加载时,它会执行。它的工作原理是因为   同源策略不会阻止动态脚本插入和   将脚本视为从域中加载的脚本   提供了网页。但是,如果此脚本尝试加载文档   从另一个域,它将失败。幸运的是,你可以改进   这种技术通过添加JavaScript Object Notation(JSON)来实现。

     

JSONP或“带填充的JSON”是对基本JSON数据的补充   格式,一种允许页面从一个页面请求数据的使用模式   服务器在不同的域中。作为这个问题的解决方案,JSONP是   替代最近的一种叫做跨源资源的方法   共享。

     

根据相同的原始政策,提供的网页来自   server1.example.com无法正常连接或与之通信   server1.example.com以外的服务器。 HTML是一个例外    元件。利用开放政策   元素,一些页面使用它们来检索JavaScript代码   对来自其他的动态生成的JSON格式数据进行操作   起源。此使用模式称为JSONP。请求JSONP   检索不是JSON,而是任意JavaScript代码。他们被评估   由JavaScript解释器,而不是由JSON解析器解析。

就个人而言,我之前遇到过这个问题,但接下来我改变了架构。我通常只是从我的Web服务器调用WCF。所以

  

来自浏览器的AJAX请求 - &gt; Web服务器 - &gt; WCF服务

我认为出于安全考虑,此限制旨在防止许多安全漏洞。但是,如果您真的想要实现您想要的并且之前的答案不符合您的要求,您可能需要查看此帖子作为替代方案。看起来很有希望。请让我更新。

希望它有所帮助。感谢。