C#4.0 WCF REST JSON - HTTP GET CODE 400错误请求

时间:2011-12-08 08:15:14

标签: wcf json rest

尝试创建一个简单的服务以通过以下几个教程返回一个简单的JSON字符串。我被两个不同的机器卡在了一个HTTP Statuscode 400错误请求上。 示例教程 使用JSON pt.1&amp ;;的RESTful WCF服务第2页 - http://www.youtube.com/watch?v=5BbDxB_5CZ8

我也有谷歌并在这里搜索(StackOverflow)类似的问题没有成功。

问题是我在尝试进行健全性检查以浏览到WCF服务并执行该方法时收到400错误请求。通过编译服务并浏览此地址:http://localhost:49510/Service1.svc/GetPerson 就像教程一样。我试过找3天的解决方案。任何帮助表示赞赏。

这就是我的工作。

首先,我创建一个简单的WCF服务应用程序的新项目。我删除了默认的Service1.svc并添加了一个新的WCF服务,它生成了一个新的Service1.svc和一个IService1.cs

以下是界面的代码( IService1.cs

namespace WcfService1
{
    // NOTE: You can use the "Rename" command on the "Refactor" menu to change the interface name "IService1" in both code and config file together.
    [ServiceContract]
    public interface IService1
    {
        [OperationContract]
        [WebInvoke(Method="GET", BodyStyle=WebMessageBodyStyle.Bare, ResponseFormat=WebMessageFormat.Json, RequestFormat=WebMessageFormat.Json, UriTemplate="GetPerson")]
        Person GetPerson();
    }

    [DataContract(Name="Person")]
    public class Person
    {
        [DataMember(Name="name")]
        public string Name { get; set; }
    }
}

以下是 Service1.svc

的代码
namespace WcfService1
{
    // NOTE: You can use the "Rename" command on the "Refactor" menu to change the class name "Service1" in code, svc and config file together.
    public class Service1 : IService1
    {
        public Person GetPerson()
        {
            return new Person() { Name = "Tobbe" };
        }
    }
}

Web.config未受影响,看起来像 web.config

<?xml version="1.0"?>
<configuration>

  <system.web>
    <compilation debug="true" targetFramework="4.0" />
  </system.web>
  <system.serviceModel>
    <behaviors>
      <serviceBehaviors>
        <behavior>
          <!-- To avoid disclosing metadata information, set the value below to false and remove the metadata endpoint above before deployment -->
          <serviceMetadata httpGetEnabled="true"/>
          <!-- To receive exception details in faults for debugging purposes, set the value below to true.  Set to false before deployment to avoid disclosing exception information -->
          <serviceDebug includeExceptionDetailInFaults="false"/>
        </behavior>
      </serviceBehaviors>
    </behaviors>
    <serviceHostingEnvironment multipleSiteBindingsEnabled="true" />
  </system.serviceModel>
 <system.webServer>
    <modules runAllManagedModulesForAllRequests="true"/>
  </system.webServer>

</configuration>

3 个答案:

答案 0 :(得分:14)

对于REST WCF您必须在web.config

中进行绑定和端点设置

通过以下方式替换整个web.config,它将起作用

<?xml version="1.0"?>
<configuration>

  <system.web>
    <compilation debug="true" targetFramework="4.0" />
  </system.web>
  <system.serviceModel>
    <protocolMapping>
      <add scheme="http" binding="webHttpBinding"/>
    </protocolMapping>
    <behaviors>
      <serviceBehaviors>
        <behavior>
          <!-- To avoid disclosing metadata information, set the value below to false and remove the metadata endpoint above before deployment -->
          <serviceMetadata httpGetEnabled="true"/>
          <!-- To receive exception details in faults for debugging purposes, set the value below to true.  Set to false before deployment to avoid disclosing exception information -->
          <serviceDebug includeExceptionDetailInFaults="false"/>

        </behavior>
      </serviceBehaviors>
      <endpointBehaviors>
        <behavior>
          <webHttp/>
        </behavior>
      </endpointBehaviors>
    </behaviors>
    <serviceHostingEnvironment multipleSiteBindingsEnabled="true" />
  </system.serviceModel>
 <system.webServer>
    <modules runAllManagedModulesForAllRequests="true"/>
  </system.webServer>  
 </configuration>

你还有两件事

使用webHttpBinding(将默认http端口映射更改为webHttpBinding)

<system.serviceModel>
    <protocolMapping>
        <add scheme="http" binding="webHttpBinding"/>
    </protocolMapping>
    <behaviors>

<system.serviceModel>

指定webHttp终点行为

<system.serviceModel>
    -----
    </protocolMapping>
    <behaviors>
        <endpointBehaviors>
            <behavior>
                <webHttp />
            </behavior >
        </endpointBehaviors>
    <behaviors>
    ------
<system.serviceModel> 

答案 1 :(得分:5)

您没有指定任何端点...默认情况下,在WCF 4上,将使用使用basicHttpBinding的端点。它在这里不起作用,因为它是一个基于SOAP的绑定。您想要使用的是webHttpBinding,它是基于REST的......

以下是如何使用WCF 4覆盖默认绑定:

<system.serviceModel>
  <protocolMapping>
    <add scheme="http" binding="webHttpBinding"/>
  </protocolMapping>
</system.serviceModel>

您还必须通过在配置中添加此端点行为来启用webHttp:

<behaviors>
    <endpointBehaviors>
        <behavior>
            <webHttp />
        </behavior >
    </endpointBehaviors>
<behaviors>

http://msdn.microsoft.com/en-us/library/bb924425.aspx

答案 2 :(得分:1)

我不完全确定原因,但是当我添加了“工厂”时。属性为我的.SVC文件(您需要将其显式拖动到Visual Studio),所有内容只需 - 而不对Web.config中的默认设置进行任何更改!

我添加了 Factory =&#34; System.ServiceModel.Activation.WebServiceHostFactory&#34; ,所以我的.SVC文件来自:

<%@ ServiceHost Language="C#" Debug="true" Service="ServiceNameSpace.ServiceName" CodeBehind="ServiceName.svc.cs" %>

到此:

<%@ ServiceHost Language="C#" Debug="true" Service="ServiceNameSpace.ServiceName" CodeBehind="ServiceName.svc.cs" Factory="System.ServiceModel.Activation.WebServiceHostFactory" %>

唯一的副作用似乎是当您在浏览器中点击.SVC文件时,您会收到一个未找到的终端&#39;错误,但无论如何,当你正确调用它时服务工作正常。如前所述,我使用.NET 4.6(Simplified WCF configuration)的默认Web.config,因此我可能需要添加端点详细信息才能再次使用。

主持人请注意:对于在几个问题上发布此答案我表示歉意。不会再做了。但是,我不认为从两个问题中删除它是非常平衡的。这就是为什么我只在这里重新发布这个答案。