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