2

我一直致力于在 .NET 4.0 中设置 WCF REST 服务。我有 GET 请求工作,但任何涉及向服务器发布数据的请求都会失败,并带有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"
4

2 回答 2

6

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

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

于 2011-12-18T18:27:28.487 回答
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);
}

服务.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 应用程序”项目模板。它为您连接了大部分必需的部件。希望这可以帮助!

于 2011-12-19T20:21:39.843 回答