2012-07-25 96 views
4

我在从jQuery调用WCF方法时遇到了错误。 当我在本地主机上实现它时,调用返回就好,但当服务驻留在单独的服务器上时引发访问被拒绝错误。使用jQuery访问拒绝错误[在本地主机上运行良好]

下面是重现该错误的步骤: -

  1. 本地运行该项目,并检查服务是否正在运行 如:HTTP://本地主机:3369/AppsterWcfService.svc/DoWork的

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

  3. 现在将该服务托管在远程服务器上,并用新的URL(即托管服务的URL)替换该URL。

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

我试图访问服务器如各种方法: -

  1. 使用MVC
  2. 处理器
  3. 简单的.aspx页面中
  4. 在jQuery的AJAX调用添加不同的参数和web.config文件。
  5. 在iis中给予不同的权限。像网络服务,iuser,匿名,访客等。

我想这是jQuery的某种跨域相关问题。 任何帮助将不胜感激。

感谢, -Sumit

+0

也请张贴一些示例代码,你有你的服务看起来像和jQuery的使用? – Rajesh 2012-07-27 13:25:48

回答

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方法错误/完成/成功不会被调用。

+0

谢谢Rajesh。 这对我有效。 – Bathla 2012-07-27 18:10:05

1

这听起来像你违反了same origin policy Web请求。

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

您需要从服务器端代码中调用服务器端代码(您的页面绑定到代理服务器),或者查看诸如JSONP请求以使您的服务以JSON格式返回数据方法调用。

+0

感谢您的帮助,同时我尝试按照建议格式化对JSONP的响应,并查看是否有效,希望让您知道,当jQuery客户端对Apache上托管的PHP服务进行Web服务调用时,应用程序运行良好服务器。 – Bathla 2012-07-26 09:54:35

+0

对于“您需要从您的服务器端代码中调用您的页面绑定的服务”,它仍然是跨域调用。我尝试过,当从同一个Web服务器本身访问跨域托管的Web服务时,我仍然遇到同样的错误[IIS] – Bathla 2012-07-26 09:58:41

+0

从我尝试过的所有技巧中,我可以这样说: - a)它绝对是问题与跨域 b)这是一个特殊的问题IIS配置 也许可能有更多的它,但这是我可以从我的凡人智力猜测:-) – Bathla 2012-07-26 09:59:45