WCF REST 4.0 PUT / POST / DELETE无法正常工作(400 Bad Request)

时间:2011-12-14 16:19:48

标签: asp.net http http-post http-put

我一直致力于在.NET 4.0中设置WCF REST服务。我有GET请求正常工作,但任何涉及POST数据到服务器的请求都失败了HTTP 400 Bad Request

这是我的简单服务:

[ServiceContract]
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall)]
public class Service1
{
    [WebGet(UriTemplate = "")]
    public string HelloWorld()
    {
        return "hello world";
    }

    [WebInvoke(UriTemplate = "", Method = "POST")]
    public string HelloWorldPost(string name)
    {
        return "hello " + name;
    }
}

我的Web.config:

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

  <system.web>
    <compilation debug="true" targetFramework="4.0" />
  </system.web>

  <system.webServer>
    <modules runAllManagedModulesForAllRequests="true">
      <add name="UrlRoutingModule" type="System.Web.Routing.UrlRoutingModule, System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
    </modules>
  </system.webServer>

  <system.serviceModel>
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true"/>
    <protocolMapping>
      <add scheme="http" binding="webHttpBinding" />      
    </protocolMapping>
    <standardEndpoints>
      <webHttpEndpoint>
        <!-- 
            Configure the WCF REST service base address via the global.asax.cs file and the default endpoint 
            via the attributes on the <standardEndpoint> element below
        -->
        <standardEndpoint name="" helpEnabled="true" automaticFormatSelectionEnabled="true"/>
      </webHttpEndpoint>
    </standardEndpoints>
  </system.serviceModel>

</configuration>

我的global.asax:

public class Global : HttpApplication
{
    void Application_Start(object sender, EventArgs e)
    {
        RegisterRoutes();
    }

    private void RegisterRoutes()
    {
        RouteTable.Routes.Add(new ServiceRoute("Service1", new WebServiceHostFactory(), typeof(Service1)));
    }
}

基本上,一切都是模板的默认设置,但我简化了Service1。我已经尝试通过调试器运行它并通过Fiddler传递请求并在IIS中运行它并执行相同操作,以及使用简单的控制台应用程序来伪造POST但我总是得到400 Bad Request错误而我不知道为什么。我看过整个互联网,无法解决任何问题。

我已尝试过以下两个请求示例(均无效):

XML:

<string xmlns="http://schemas.microsoft.com/2003/10/Serialization/">String content</string>

JSON:

"String content"

2 个答案:

答案 0 :(得分:6)

您是否在请求中正确设置了Content-Type标头?对于XML请求,它应该是text/xml,对于JSON,它应该是application/json。当我在Fiddler中设置Content-Type时,您的代码适用于我。

您还应该将GET中的Accept标头设置为text/xmlapplication/json,具体取决于您希望响应的格式。可以将POST作为服务器将假定您希望响应的格式与请求相同,因为您已在web.config中设置了automaticFormatSelectionEnabled="true"。有关WCF REST中格式选择的更多详细信息,请访问:http://blogs.msdn.com/b/endpoint/archive/2010/01/18/automatic-and-explicit-format-selection-in-wcf-webhttp-services.aspx

答案 1 :(得分:1)

您的属性不应该在实现中,它们应该在操作合同中。您还需要确保UriTemplate中包含任何命名参数。它们区分大小写,所以它们必须完全匹配。

<强> IService.cs

[ServiceContract]
public class IService1
{
    [WebGet(UriTemplate = "")]
    [OperationContract]
    public string HelloWorld();

    [WebInvoke(UriTemplate = "/{name}", Method = "POST")]
    [OperationContract]
    public string HelloWorldPost(string name);
}

<强> Service.cs

public class Service1 : IService
{

    public string HelloWorld()
    {
        return "hello world";
    }

    public string HelloWorldPost(string name)
    {
        return "hello " + name;
    }
}

您需要在web.config文件中配置服务以及System.ServiceModel

<system.serviceModel>
    <services>
      <service name="Service1">
        <endpoint address="basic" binding="basicHttpBinding" contract="IService1" />
      </service>
    <services>
</system.serviceModel>

这是一些主要概念,应该让你开始朝着正确的方向前进。如果你想要一个好的测试项目开始,只需使用VS2010中的“WCF应用程序”项目模板。它有大部分必需的部分为您连接。希望这有帮助!