4

我正在GET向 WCF Web 服务发出请求。我的 WCF 服务位于http://localhost/RestService/RestService.svc/web/GetMessage并具有以下界面:

[OperationContract]
[WebGet(UriTemplate = "GetMessage", ResponseFormat = WebMessageFormat.Json)]
String GetMessage();

端点配置正确,因为我可以在浏览器中进行裸调用:

  <system.serviceModel>
    <behaviors>
      <serviceBehaviors>
        <behavior name="WebServiceBehavior">
          <serviceMetadata httpGetEnabled="true" />
          <serviceDebug includeExceptionDetailInFaults="true"/>
        </behavior>
      </serviceBehaviors>

      <endpointBehaviors>
        <behavior name="WebEndpointBehavior">
          <webHttp />
          </behavior>
      </endpointBehaviors>
    </behaviors>

    <services>
      <service name="TestRestService.RestService"
               behaviorConfiguration="WebServiceBehavior">
        <endpoint name="RestWeb"
                  address="web"
                  binding="webHttpBinding"
                  behaviorConfiguration="WebEndpointBehavior"
                  contract="TestRestService.IRestService" />
      </service>
    </services>
  </system.serviceModel>

在我的浏览器中通过导航调用它会返回:

{"GetMessageResult":"Hello World!"}

到现在为止还挺好。这里没有问题。快速查看执行yield 的jQuery 文档GET

<html>
    <head>
        <script type="text/javascript" src="jquery-1.7.2.min.js"></script>
        <script type="text/javascript">
            $.ajax({
                url: 'http://localhost/RestService/RestService.svc/web/GetMessage',
                type: 'GET',
                dataType: 'json',
                success: function (data) {
                    alert(data);
                },
                error: function (xhr, status, message) {
                    alert("Error: " + status + " " + message); }
                });
        </script>
    </head>
    <body>
    </body>
</html>

我使用 jQuery 1.72 在一个小的 html 测试页面中运行它,我收到以下错误:

Error: error

是什么赋予了?我在这里找到的错误消息处理程序给了我绝对零有用的信息。简单的说:

  • 为什么我的 GET 失败?
  • 为什么错误信息没有用?

解决方案

事实证明,正如 Kevin B在他的回答中所建议的那样,jQuery 本身并不支持跨域 ajax 请求。为了解决这个问题,我不得不切换到使用dataType: 'jsonp'并添加一个启用属性webHttpBindingcrossDomainScriptEnabled

<bindings>
  <webHttpBinding>
    <binding name="WebBindingWithScripts"
             crossDomainScriptAccessEnabled="true">
      <security mode="None" />
    </binding>
  </webHttpBinding>
</bindings>


<endpoint name="RestWeb"
          address="web"
          binding="webHttpBinding"
          behaviorConfiguration="WebEndpointBEhavior"
          bindingConfiguration="WebBindingWithScripts"
          contract="TestService.IRestService">
</endpoint>

使用 onlydataType: 'jsonp'时,除非您将 WCF 服务配置为允许跨域脚本,否则您仍然会收到错误。

4

2 回答 2

2

您是否正在发出跨域请求?我看到您使用的是 localhost,但这并不一定意味着您是从 localhost 请求的(据我们所知,您可能正在使用不同的端口或协议)。

在这种情况下,请求失败的原因有两个:

  1. 返回的 JSON 包含其他字符,使其无效 json
  2. 请求来自与 Web 服务不同的域。

由于您same-origin在控制台中没有看到错误,我希望它是 #1。但是,既然你得到了error而不是parseerror,那是不可能的。

于 2012-06-29T16:44:09.390 回答
2

这发生在我身上一次,我所做的只是在我的 web.config 中添加 endpointBehaviors 以支持这样的 WebHttp 请求

  <behaviors>
  <serviceBehaviors>
   ......
   </behavior>
  </serviceBehaviors>   
  <endpointBehaviors>
        <behavior name="EndpBehavior">
            <webHttp/>
        </behavior>
    </endpointBehaviors>

并更改了我的端点以包含“behaviorConfiguration”并更改了绑定

 <endpoint address="" binding="webHttpBinding" contract="IService1" 
  behaviorConfiguration="EndpBehavior">

不要忘记将其添加到您的 IService :

[WebGet(ResponseFormat =WebMessageFormat.Json)]
于 2012-06-29T17:31:28.197 回答