jQuery访问被拒绝错误[在localhost上运行正常]

时间:2012-07-25 15:28:56

标签: android jquery wcf cordova cross-domain

从jQuery调用WCF方法时遇到错误。 当我在localhost上实现它时,调用返回正常,但当服务托管在单独的服务器上时,会抛出拒绝访问错误。

以下是重现错误的步骤: -

  1. 在本地运行项目并检查服务是否正在运行 e.g.:http://localhost:3369/AppsterWcfService.svc/DoWork

  2. 在本地创建测试客户端(test.html)页面并运行此项目。 单击登录按钮时,它可以正常工作。

  3. 现在在远程服务器上托管服务,并将url替换为新的url,即托管服务的url。

  4. 现在运行test.html页面,点击按钮。在这里,我得到访问被拒绝错误。

  5. 我尝试了各种访问服务器的方法,例如: -

    1. 使用MVC
    2. 处理程序
    3. simple .aspx page
    4. 在jquery ajax调用和web.config文件中添加不同的参数。
    5. 在iis中赋予不同的权限。比如网络服务,iuser,匿名,访客等。
    6. 我认为这是与jQuery的某种跨域相关问题。 任何帮助将不胜感激。

      谢谢, -Sumit

2 个答案:

答案 0 :(得分:1)

听起来您违反了same origin policy网络请求。

如果在您的浏览器中,您的协议(http / https),服务器和/或端口与远程服务不同,则您将违反相同的原始策略,并且您的浏览器将阻止进行该呼叫。

您需要从与您的页面绑定的服务器端代码调用服务(充当代理),或者查看类似JSONP请求的内容,让您的服务将数据作为JSON格式的方法调用。

答案 1 :(得分: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来自URL查询字符串

现在从您的页面开始执行以下调用上述WCF REST服务的JavaScript,如下所示:

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方法错误/完成/成功。