为什么不通过JSON Ajax访问此WCF服务?

时间:2011-11-02 03:15:22

标签: ajax wcf json

我有一个需要通过SOAP(工作)和JSON(不工作)调用的WCF服务。

我的C#代码:

[ServiceContract]
public interface IService1
{
    [OperationContract]
    [WebGet(ResponseFormat=WebMessageFormat.Json)]
    string Foo();
}

public class Service1 : IService1
{
    public string Foo()
    {
        return "woohooo";
    }
}

这是我的配置:

<?xml version="1.0"?>
<configuration>
  <system.web>
    <compilation debug="true" targetFramework="4.0" />
  </system.web>
  <system.serviceModel>

    <services>
      <service name="Service1">
        <endpoint address="soap" binding="basicHttpBinding" contract="DummyService.IService1"/>
        <endpoint address="json" binding="webHttpBinding" behaviorConfiguration="jsonBehavior" contract="DummyService.IService1"/>
      </service>
    </services>

    <behaviors>
      <serviceBehaviors>
        <behavior>
          <serviceMetadata httpGetEnabled="true"/>
          <serviceDebug includeExceptionDetailInFaults="true"/>
        </behavior>
      </serviceBehaviors>
      <endpointBehaviors>
        <behavior name="jsonBehavior">
          <enableWebScript/>
          <webHttp/>
        </behavior>
      </endpointBehaviors>
    </behaviors>

    <serviceHostingEnvironment multipleSiteBindingsEnabled="true" />

  </system.serviceModel>
 <system.webServer>
    <modules runAllManagedModulesForAllRequests="true"/>
  </system.webServer>

</configuration>

这是我的Javascript:

$.getJSON("/Service1.svc/Foo")
    .success(function (result) {
        alert("success! " + result);
    })
    .fail(function (result) {
        console.log("failed!");
        console.log(result);
    });

我得到的回答是“400 Bad Request”。我究竟做错了什么?我遵循了REST / SOAP endpoints for a WCF service中的建议,但它仍然是没有工作的。 :-)帮助!

4 个答案:

答案 0 :(得分:1)

我在想这是因为您使用的网址是绝对网址,而不是相对网址。

如果您在ASP.NET调试器中运行此服务,则该服务将在以下地址上提供:

http://localhost:52200/Web/Service1.svc

因为您在URL前面加了正斜杠,所以服务查询实际上是发送到

http://localhost:52200/Service1.svc

因此,您需要传递相应的相对地址。如果您的服务和脚本文件位于同一目录中,请将其更改为:

$.getJSON("./Service1.svc/Foo")

答案 1 :(得分:1)

尝试在服务URL中包含端点地址。类似的东西:

$.getJSON("/Service1.svc/json/Foo")

此外,您应该启用WCF tracing以查看返回的错误。您需要Service Trace Viewer才能查看日志信息。

<强>更新

以下是使用您的代码的示例。

配置文件包含

<system.serviceModel>
    <serviceHostingEnvironment multipleSiteBindingsEnabled="true"/>

    <services>
      <service behaviorConfiguration="jsonServiceBehavior" name="DummyService.Service1">
        <endpoint address="soap" binding="basicHttpBinding" contract="DummyService.IService1"/>
        <endpoint address="json" 
                  behaviorConfiguration="jsonBehavior" 
                  binding="webHttpBinding" contract="DummyService.IService1"/>
      </service>
    </services>

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

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

我创建了一个空的Web项目并添加了以下HTML页面来测试该服务。

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <title></title>
    <script src="Scripts/jquery-1.6.4.min.js" type="text/javascript"></script>
    <script type="text/javascript">
        $(document).ready(function () {
            $.getJSON("/Service1.svc/json/Foo")
            .success(function (result) {
                alert("success! " + result);
            })
            .fail(function (result) {
                console.log("failed!");
                console.log(result);
            });
        });
    </script>
</head>
<body>    

</body>
</html>

我的Service1.svc有以下内容:

<%@ ServiceHost Language="C#" Service="DummyService.Service1" %>

答案 2 :(得分:1)

尝试从端点行为中取出<webHttp />元素。

我有一个由Ajax调用的Web服务,它没有这个元素。

当我尝试放入元素时,它停止工作。

(不可否认,这与未识别日期格式有关,因此它与您的问题不完全匹配。)

答案 3 :(得分:1)

(我的第三个答案。我知道其中一个答案是正确的: - )

尝试在serviceHostingEnvironment上将aspNetCompatibilityEnabled设置为true。

   <serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" />

这只是猜测。当我关闭我的实现时,调用仍然到达,但HttpContext.Current返回NULL。