当其他对WCF服务的调用成功时,JQuery AJAX调用失败

时间:2012-11-29 21:19:16

标签: wcf jquery

我正在尝试设置一个简单的WCF REST服务,我们可以从jquery调用它。当我在浏览器中访问URL时,我收到了回复。当我尝试直接发送HTTPRequest(使用Firefox插件RESTClient)时,我得到了回复。这些回复对我来说是正确的,包含标题和一串JSON,显然没有别的。

但是,当我通过jquery.get()或jquery.post()调用调用此相同的服务时,没有任何反应。使用jquery.ajax()调用显示错误回调被调用,但对我来说,给错误回调的数据并没有给我提供线索,说明为什么这不起作用。

<a id="thelink" href="javascript:void(0)">GO</a>
<script type="text/javascript">
    function doAjax() {
        $.ajax({type: "POST",
                dataType: "json", // see note below
                url: "http://localhost:54459/MySimpleService.svc/json/24",
                success: function(jqXHR, textStatus) {
                             alert("success");
                         },
                error: function(jqXHR, textStatus, errorThrown) {
                             alert("error");
                         }
               });
        }
    $('#thelink').click(doAjax);
</script> 

注意:对于dataType参数,我已经尝试了所有&#34; text&#34;,&#34; json&#34;,&#34; jsonp&#34;并关闭参数。同样,我尝试过GET和POST(修改Web服务以分别响应GET或POST)。

在该端点调用的方法并没有做任何应该失败的壮观事件 - 它只是将字符串连接到一个常量并返回(只是测试此时,它显然会在将来做更多有趣的事情) )

当我点击链接时,Firefox会让我看到200 OK。

WCF服务用完了我的Visual Studio 2010调试环境。它命中了响应此服务方法的方法中的断点。

我尝试从本地计算机上的文件(端口80)访问上面发布的html,并在其他地方托管它,结果相同。这可能是一个安全问题吗?

传递给错误回调的值似乎没什么帮助:

  • jqXHR - readyState:0,status:0,statusText:error
  • textStatus - &#34;错误&#34;
  • errorThrown - &#34;&#34;

那么,当我在浏览器或RESTClient中调用url时,为什么我的服务似乎有效,对于GET或POST,但是当我尝试从jquery.ajax()调用它时失败?

编辑:根据我收到的评论进行了更多测试后,我尝试在与网络服务相同的端口上使用javascript托管页面,这显示成功。在我的真实场景中,我不会在同一个域/端口上托管客户端代码和Web服务。我假设这是一个安全模型问题 - 我在哪里允许这种访问(白名单域/端口或其他)

2 个答案:

答案 0 :(得分:1)

问题似乎出现在我的web.config中;正如我们在评论中所做的那样,问题是跨域安全性问题。我已经在我的端点上使用了webHttpBinding,但没有意识到需要配置它:

<system.serviceModel>
    <bindings>
        <webHttpBinding>
            <binding name="webHttpBindingWithJsonP" crossDomainScriptAccessEnabled="true"/>
        </webHttpBinding>
    </bindings>
    ...
</system.serviceModel>

设置crossDomainScriptAccessEnabled="true"似乎已经成功了。请注意,我已将<serviceMetadata httpGetEnabled="true"/>作为我服务行为的一部分。

答案 1 :(得分:0)

确保您已经配置了要从脚本客户端调用的服务:在您的服务中添加web.config中的几个元素:

<behaviors>
 <endpointBehaviors>
  <behavior name="webScriptEnablingBehavior">
  <enableWebScript/>
 </behavior>
</endpointBehaviors>

此处有更多信息:http://msdn.microsoft.com/en-us/library/bb763177(v=vs.90).aspx

希望它有所帮助,