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

本文关键字:CS 错误 REST 服务 WCF | 更新日期: 2023-09-27 18:22:20

嗨,我有一个使用(WCF REST服务模板40(CS((的WCF Rest服务。我已经设法让它返回 Json 响应。运行项目时它工作正常。但是当我尝试从浏览器对服务进行 Ajax调用时,出现错误:

跨源请求被阻止:同源策略不允许读取 http://192.168.0.70:8001/Service/test 的远程资源。 这可以通过将资源移动到同一域或 启用 CORS。

阿贾克斯的电话:

$.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>

我尝试添加跨域脚本访问启用="true",但是当我这样做时,该服务在本地主机上也不起作用。我明白这个:

跨域 JavaScript 回调在经过身份验证中不受支持 服务业。

我需要在 web.config 文件中更改什么?

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

实际上,我遇到了这个问题,我进一步检查了WebAPI,并且在分析时需要同样的努力。所以我不得不修复这个CORS with WCF.我将尝试简短地解释。来吧。当您使用 CrossOrigin 访问 WCF 请求时,例如从不同域中存在的 JS 代码和 JS ,您尝试执行PUTPOST请求,第一个浏览器405 HTTP Status发送OPTION请求,以查看此域是否在允许列表中,然后如果您的WCF响应OPTIONS请求, 发送带有标头值的所需响应,然后浏览器将再次执行POSTPUT请求(浏览器之前发出的请求(,它将按预期工作。

注意:您不能发送("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

.
protected void Application_BeginRequest(object sender, EventArgs e)
{
    String domainname = HttpContext.Current.Request.Headers["Origin"].ToString();
    if (IsAllowedDomain(domainname))
        HttpContext.Current.Response.AddHeader("Access-Control-Allow-Origin", domainname);
    String allowedmethods =  "POST, PUT, DELETE, GET";
    String headers = HttpContext.Current.Request.Headers["Access-Control-Request-Headers"].ToString();
    String accesscontrolmaxage =  "1728000";
    String contenttypeforoptionsrequest = "application/json";

    if (HttpContext.Current.Request.HttpMethod == "OPTIONS")
    {
        //These headers are handling the "pre-flight" OPTIONS call sent by the browser
        HttpContext.Current.Response.AddHeader("Access-Control-Allow-Methods", allowedmethods);
        HttpContext.Current.Response.AddHeader("Access-Control-Allow-Headers", headers);
        HttpContext.Current.Response.AddHeader("Access-Control-Max-Age", accesscontrolmaxage);
        HttpContext.Current.Response.AddHeader("ContentType", contenttypeforoptionsrequest);
        HttpContext.Current.Response.End();
    }
}
private bool IsAllowedDomain(String Domain)
{
    if (string.IsNullOrEmpty(Domain)) return false;
    string[] alloweddomains = "http://192.168.0.70:8001"; // you can place comma separated domains here.
    foreach (string alloweddomain in alloweddomains)
    {
        if (Domain.ToLower() == alloweddomain.ToLower())
            return true;
    }
    return false;
}

将以下内容放在 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();
    }
}

你可能想看看这个链接中的帖子:

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

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

有一种方法可以摆脱这种限制 - 插入一个 网页中的动态脚本元素,其源指向 到其他域中的服务 URL,并获取脚本中的数据 本身。当脚本加载时,它将执行。它之所以有效,是因为 同源策略不会阻止动态脚本插入和 将脚本视为从域加载的 提供了网页。但是,如果此脚本尝试加载文档 从另一个域,它将失败。幸运的是,您可以改进 这种技术通过将JavaScript对象表示法(JSON(添加到组合中。

JSONP或"带填充的JSON"是对基本JSON数据的补充 格式,一种使用模式,允许页面从 服务器位于不同的域中。作为此问题的解决方案,JSONP 是 称为跨源资源的最新方法的替代方法 共享。

在同源策略下,从 server1.example.com 通常无法连接到 server1.example.com 以外的服务器。一个例外是 HTML 元素。利用开放策略 元素,某些页面使用它们来检索 JavaScript 代码 对来自其他的动态生成的 JSON 格式数据进行操作 起源。这种使用模式称为 JSONP。对 JSONP 的请求 检索的不是 JSON,而是任意 JavaScript 代码。他们被评估 由 JavaScript 解释器解析,而不是由 JSON 解析器解析

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

来自浏览器的 AJAX 请求 -> Web 服务器 -> WCF 服务

我认为出于安全目的,建立此限制是为了防止许多安全漏洞。但是,如果您真的想实现您想要的并且之前的答案不符合您的要求,您可能需要看看这篇文章作为替代方案。这似乎很有希望。请让我了解最新情况。

希望对您有所帮助。谢谢。