我正在尝试设置一个简单的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,并在其他地方托管它,结果相同。这可能是一个安全问题吗?
传递给错误回调的值似乎没什么帮助:
那么,当我在浏览器或RESTClient中调用url时,为什么我的服务似乎有效,对于GET或POST,但是当我尝试从jquery.ajax()调用它时失败?
编辑:根据我收到的评论进行了更多测试后,我尝试在与网络服务相同的端口上使用javascript托管页面,这显示成功。在我的真实场景中,我不会在同一个域/端口上托管客户端代码和Web服务。我假设这是一个安全模型问题 - 我在哪里允许这种访问(白名单域/端口或其他)
答案 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
希望它有所帮助,