1

我已经使用以下 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 消息时,一切正常。但是,当我尝试使用 ContentType = "application/json"发送 POST 消息时, 它失败并显示以下消息: 远程服务器返回错误:(400)错误请求

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

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

据我了解,仅当您不想编辑 web.config 时,定义 WebServiceHostFactory 才有用。

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

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

4

1 回答 1

3

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

于 2012-12-12T14:51:26.787 回答