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 文件中更改什么?
实际上,我遇到了这个问题,我进一步检查了WebAPI,并且在分析时需要同样的努力。所以我不得不修复这个CORS with WCF
.我将尝试简短地解释。来吧。当您使用 CrossOrigin 访问 WCF 请求时,例如从不同域中存在的 JS 代码和 JS ,您尝试执行PUT
或POST
请求,第一个浏览器405 HTTP Status
发送OPTION
请求,以查看此域是否在允许列表中,然后如果您的WCF
响应OPTIONS
请求, 发送带有标头值的所需响应,然后浏览器将再次执行POST
或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
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 服务
我认为出于安全目的,建立此限制是为了防止许多安全漏洞。但是,如果您真的想实现您想要的并且之前的答案不符合您的要求,您可能需要看看这篇文章作为替代方案。这似乎很有希望。请让我了解最新情况。
希望对您有所帮助。谢谢。