您好我有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文件中更改哪些内容?
答案 0 :(得分:3)
实际上,我已经面临这个问题,我已经更进一步检查WebAPI,当我分析时,需要同样的努力。所以我必须解决这个CORS with WCF
。我会尽量解释一下。开始了。当您使用CrossOrigin访问WCF请求时,例如来自不同域中的JS代码和JS,您尝试执行PUT
或POST
请求,第一个浏览器发送OPTION
请求{{ 1}},要查看此域是否在允许列表中,那么如果您的405 HTTP Status
响应WCF
请求,发送带有标头值的必需响应,那么浏览器将再次执行OPTIONS
或POST
请求(之前发布的浏览器),它将按预期工作。
注意:您无法发送PUT
,因为有一项安全功能,要求在("Access-Control-Allow-Origin", "*")
而不是Access-Control-Allow-Origin
中列出所需的域名。
了解更多信息 -
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服务
我认为出于安全考虑,此限制旨在防止许多安全漏洞。但是,如果您真的想要实现您想要的并且之前的答案不符合您的要求,您可能需要查看此帖子作为替代方案。看起来很有希望。请让我更新。
希望它有所帮助。感谢。