使用jQuery时出现访问被拒绝错误 [本地主机上运行正常]

4
当我从jQuery调用WCF方法时,遇到了错误。 当我在本地实现它时,调用返回正常,但是当服务托管在另一台服务器上时,会抛出访问被拒绝的错误。
以下是重现错误的步骤:
1. 在本地运行项目并检查服务是否正在运行,例如:http://localhost:3369/AppsterWcfService.svc/DoWork 2. 在本地创建一个测试客户端(test.html)页面并运行此项目。单击登录按钮时,它可以正常工作。 3. 现在将服务托管在远程服务器上,并替换URL为托管服务的新URL。 4. 现在运行test.html页面,单击按钮。这里我得到了访问被拒绝的错误。
我已经尝试了各种访问服务器的方法,例如:
1. 使用MVC 2. 处理程序 3. 简单的.aspx页面 4. 在jquery ajax调用和web.config文件中添加不同的参数。 5. 在IIS中给予不同的权限,如network service、iuser、anonymous、guest等。
我认为这是与jQuery相关的跨域问题。 任何帮助将不胜感激。
谢谢, -Sumit

请提供一些您的示例代码,例如您的服务是什么样子的以及使用了哪些jQuery? - Rajesh
2个回答

1

如果您想使用jQuery消费跨域WCF REST服务,请参考以下示例:

我的服务如下所示:

    [ServiceContract]
    public interface IJSONPService
    {
        [OperationContract]
        [WebGet]
        string GetDate();

        [OperationContract]
        [WebInvoke]
        string PostData(string name);
    }

现在,我上述服务的配置条目如下所示:

<services>
    <service name="Service.JSONPService">
        <endpoint address="" binding="webHttpBinding" behaviorConfiguration="json" bindingConfiguration="defaultRestJsonp" contract="Service.IJSONPService">
        </endpoint>
    </service>
</services>
<behaviors>
      <endpointBehaviors>
         <behavior name="json">
             <enableWebScript />
         </behavior>
   </behaviors>
</endpointBehaviors>
<webHttpBinding>
        <binding name="defaultRestJsonp" crossDomainScriptAccessEnabled="true">
          <readerQuotas maxStringContentLength="2147483647" maxArrayLength="2147483647" maxBytesPerRead="2147483647" maxDepth="64" maxNameTableCharCount="2147483647" />
          <security mode="None" />
        </binding>
</webHttpBinding>

您需要注意绑定元素"defaultRestJsonp"中的"crossDomainScriptAccessEnabled"属性,该属性负责确定请求为JSONP并适当地将响应转换为以回调方法为包装的URL查询字符串。
现在从您的页面执行以下JavaScript,调用上述WCF REST服务,如下所示:
function TestingWCFRestWithJsonp() {
                $.ajax({
                    url: "http://domain.com/Service/JSONPService.svc/GetDate",
                    dataType: "jsonp",
                    type: "GET",
                    timeout: 10000,
                    jsonpCallback: "MyCallback",
                    success: function (data, textStatus, jqXHR) {
                        alert(data);
                    },
                    error: function (jqXHR, textStatus, errorThrown) {alert('error');

                    },
                    complete: function (jqXHR, textStatus) {alert('complete');
                    }
                });
            }
            function MyCallback(data) {
                alert(data);
            }

请查看$.ajax方法调用中的jsonpCallback属性。
Web服务调用的原始请求如下:
GET http://localhost/Service/JSONPService.svc/GetDate?callback=MyCallback&_=1343391683779 HTTP/1.1
Host: localhost
Connection: keep-alive

而来自WCF REST服务的原始响应如下:

HTTP/1.1 200 OK
Cache-Control: private
Content-Type: application/x-javascript
Date: Fri, 27 Jul 2012 12:21:23 GMT
Content-Length: 27

MyCallback("27\/07\/2012");

注意:当您执行JSONP请求时,您的$.ajax方法的error/complete/success不会被调用。


1

听起来你正在违反Web请求的同源策略

如果在你的浏览器中,你的协议(http/https)、服务器和/或端口与你的远程服务不同,那么你将会违反同源策略,你的浏览器将阻止该调用的发生。

你需要从你的服务器端代码中调用服务(充当代理),或者尝试使用JSONP请求,以便让你的服务返回数据作为JSON格式的方法调用。


感谢您的帮助,我正在尝试按照建议将我的响应格式化为JSONP并查看是否有效。我想让您知道,当jQuery客户端调用服务器上托管的Apache上的PHP服务时,应用程序运行良好。 - Bathla
关于“您需要从与页面绑定的服务器端代码调用服务”的问题,这仍然是跨域调用。我尝试过了,当从同一Web服务器[IIS]访问跨域托管的Web服务时,仍会出现相同的错误。 - Bathla
从我尝试的所有技巧来看,我可以说: a)这绝对是跨域问题 b)这是IIS配置特有的问题 可能还有更多问题,但这是我从我的有限智慧中猜测出来的 :-) - Bathla
好的!就是这个了!我也尝试过使用JSONP,但结果一样:( - Bathla

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接