应用程序/ json内容类型请求的Restful WCF POST问题

时间:2012-12-12 13:07:13

标签: json wcf post wcf-rest bad-request

我使用以下POST“操作”配置了RESTful WCF:

[OperationContract]
[WebInvoke(Method = "POST", UriTemplate = "/Test", BodyStyle = WebMessageBodyStyle.Bare, RequestFormat = WebMessageFormat.Json)]
void PostTest(Stream stream);

在我的web.config中,我配置了以下内容:

<service name="MyTest.TestSvc" behaviorConfiguration="MyTest.TestBehavior" >
    <endpoint address="" behaviorConfiguration="MyBehavior" binding="webHttpBinding" contract="MyTest.ITestSvc"/>
     <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
</service>

<endpointBehaviors>
    <behavior name="MyBehavior">
        <webHttp />
    </behavior>
</endpointBehaviors>

<serviceBehaviors>
    <behavior name="MyTest.TestBehavior">
        <serviceMetadata httpGetEnabled="true" />
        <serviceDebug includeExceptionDetailInFaults="true" />
    </behavior>
</serviceBehaviors>

当我使用“text / plain”“json”发送POST消息时,一切正常。 但是,当我尝试发送POST消息时 ContentType =“application / json” 它失败并显示以下消息: 远程服务器返回错误:(400)错误请求

我找到的唯一解决方案是定义Factory类: System.ServiceModel.Activation.WebServiceHostFactory int Svc定义标记。

我在以下链接中找到了此解决方案: Send JSON to WCF 3.5 using Ajax

据我所知,定义WebServiceHostFactory仅在您不想编辑web.config时才有用。

如何在不定义WebServiceHostFactory的情况下使其工作?

请注意,我成功获得了“json”内容类型的POST消息,但没有获得“application / json”内容类型。

1 个答案:

答案 0 :(得分:3)

问题是要使用原始编程模型(使用Stream参数),您需要告诉WCF不要尝试将请求理解为JSON,而只是将原始请求主体传递给参数。你可以使用WebContentTypeMapper来做到这一点。 http://blogs.msdn.com/b/carlosfigueira/archive/2008/04/17/wcf-raw-programming-model-receiving-arbitrary-data.aspx上的帖子显示了如何做到这一点。工厂的解决方案有效,因为它在创建端点时会这样做。