【问题标题】:Access Denied Error with jQuery [Runs fine on localhost]使用 jQuery 访问被拒绝错误 [在本地主机上运行良好]
【发布时间】:2012-07-24 02:13:33
【问题描述】:

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

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

  1. 本地运行项目,检查服务是否运行 例如:http://localhost: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 的某种跨域相关问题。 任何帮助将不胜感激。

谢谢, -苏米特

【问题讨论】:

  • 另外请发布一些您拥有的示例代码,即您的服务是什么样的以及正在使用的 jquery?

标签: android jquery wcf cordova cross-domain


【解决方案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 的回调方法字符串

现在从您的页面执行以下调用上述 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 方法错误/完成/成功不会被调用。

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

    • 感谢您的帮助,我尝试按照建议格式化我对 JSONP 的响应,看看是否可行,想让您知道,当 jQuery 客户端向PHP 服务托管在服务器上的 Apache 上。
    • 对于“您需要从您的页面绑定的服务器端代码调用服务”,它仍然是一个跨域调用。我试过了,从同一个 Web 服务器本身 [IIS] 访问跨域托管 Web 服务时仍然遇到同样的错误
    • 从我尝试过的所有技巧中,我可以这样说:-a)这绝对是跨域的问题 b)这是 IIS 配置特有的问题 可能还有更多问题但这就是我可以从我的凡人智慧中猜到的:-)
    • 好的!这里是!我也尝试过 JSONP,但得到相同的结果:-(
    猜你喜欢
    • 2016-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-21
    • 1970-01-01
    • 1970-01-01
    • 2012-06-28
    • 2022-01-05
    相关资源
    最近更新 更多