1

我正在尝试设置一个简单的 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 参数,我已经尝试了所有的“text”、“json”、“jsonp”并将参数关闭。同样,我尝试过使用 GET 和 POST(修改 Web 服务以分别响应 GET 或 POST)。

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

当我单击链接时,Firefox 显示返回 200 OK。

WCF 服务正在耗尽我的 Visual Studio 2010 调试环境。它会命中放置在响应此服务方法的方法中的断点。

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

传递给错误回调的值似乎没有太大帮助:

  • jqXHR - readyState:0,状态:0,statusText:错误
  • 文本状态-“错误”
  • 错误抛出 - “”

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

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

4

2 回答 2

1

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

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

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

于 2012-12-04T14:39:20.623 回答
0

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

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

更多信息在这里:http: //msdn.microsoft.com/en-us/library/bb763177 (v=vs.90).aspx

希望能帮助到你,

于 2012-11-29T21:29:21.113 回答