如何使用Jquery + Ajax调用webservices

时间:2016-07-05 07:11:47

标签: jquery json ajax web-services cors

我的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),但我无法理解这个解决方案。

2 个答案:

答案 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";
}