我的Jquery + ajax调用有问题,它会通过跨域使用我的一个Web服务方法。我一直在尝试所有可能的方式来完成但仍然没有成功。请帮我解决我做错的事。我可能需要为某些安全设置配置Web服务器吗?下面是我的代码。如果您对我的代码有任何疑问,请告诉我。
我在我的网络服务的web.config中添加了这个。
python-2.7.11
这是我的申请
<system.webServer>
<httpProtocol>
<customHeaders>
<add name="Access-Control-Allow-Origin" value="*" />
</customHeaders>
</httpProtocol>
</system.webServer>
IE控制台显示此错误
XMLHttpRequest:网络错误0x80070005,访问被拒绝。
Google Chrome控制台显示此错误。
XMLHttpRequest无法加载http://si-cb01:10000/service1.asmx/GetJsonData。 这里si-cb01只是系统名称,IP 192.168。*。***
对预检请求的响应没有通过访问控制检查:否&#39;访问控制 - 允许 - 来源&#39;标头出现在请求的资源上 起源&#39; http://localhost:xxx&#39;因此不允许访问。
响应的HTTP状态代码为500。
我查找了问题,它似乎是一个缺失的跨源资源共享(CORS),但我无法理解这个解决方案。
答案 0 :(得分:2)
要在IIS上启用CORS,请将以下内容添加到服务器应用程序的web.config文件中:
<configuration>
<system.webServer>
<httpProtocol>
<customHeaders>
<add name="Access-Control-Allow-Origin" value="*" />
</customHeaders>
</httpProtocol>
</system.webServer>
</configuration>
只是为了解释,当您调用托管在不同域(您的应用程序除外)上的某项服务时,浏览器会发送预检请求(请求使用http OPTION
动词而不是POST
或{{ 1}})它等待答案。根据{{1}}策略,答案来自服务器,意味着服务器是否可以响应客户端请求。仅当服务可以使用GET
响应时,您才可以使用CORS
,在这种情况下,响应将包含以下内容:
JSONP
其中JSONP
是全局函数,用于获取jsonp_callback(<YOUR JSON>)
并将其发送到ajax回调函数。
要详细了解如何启用jsonp_callback
,请访问此网站http://enable-cors.org/
答案 1 :(得分:0)
这是因为出于安全原因,您的ASMX服务未配置为提供来自其他域的请求。您只需在网络服务的web.config
中添加此内容即可。
<system.webServer>
<httpProtocol>
<customHeaders>
<add name="Access-Control-Allow-Origin" value="*" />
</customHeaders>
</httpProtocol>
</system.webServer>
请注意,这将允许所有网站访问您的网络服务。如果您只想要特定网站访问您的网络服务,请更改自定义标头,如下所示
<add name="Access-Control-Allow-Origin" value="http://example-site.com" />
这将为您提供有关CORS的详细信息:http://enable-cors.org/
P.S:请勿在使用success
时使用error
和$.ajax
回调,因为它们已被弃用。
弃用通知:自jQuery 3.0起,
jqXHR.success()
,jqXHR.error()
和jqXHR.complete()
回调将被删除。您可以使用jqXHR.done()
,jqXHR.fail()
和jqXHR.always()
代替。
更新:尝试设置这些。
在web.config中
<location path="service1.asmx">
<system.web>
<webServices>
<protocols>
<clear />
<add name="HttpGet" />
<add name="HttpPost" />
</protocols>
</webServices>
</system.web>
</location>
像这样装饰你的方法
[ScriptMethod(UseHttpPost = true)]
public string GetJsonData()
{
return "Hello World";
}