Restful WCF POST issue with application/json content type request

橙三吉。 提交于 2019-12-06 12:28:55

问题


I've configured a RESTful WCF with the following POST "operation":

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

In my web.config, I've configured the following:

<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>

When I sent a POST message using "text/plain" or "json" everything works fine. However, when I try to send a POST message with ContentType = "application/json" It fails with the following message: The remote server returned an error: (400) Bad Request

The only solution which I found was to define the Factory class : System.ServiceModel.Activation.WebServiceHostFactory int the Svc definition markup.

I found this solution in the following link: Send JSON to WCF 3.5 using Ajax

As I understood , defining the WebServiceHostFactory is only useful if you don't want to edit the web.config.

How can I make it work without defining the WebServiceHostFactory?

Notice that I succeed to get "json" content type POST message but not "application/json" content type.


回答1:


The problem is that to use the raw programming model (using a Stream parameter), you'll need to tell WCF to not try to understand the request as JSON, instead just pass the raw request body to the parameter. You can do that using a WebContentTypeMapper. The post at http://blogs.msdn.com/b/carlosfigueira/archive/2008/04/17/wcf-raw-programming-model-receiving-arbitrary-data.aspx shows how this can be done. The solution with the factory works because it does that when it creates the endpoint.



来源:https://stackoverflow.com/questions/13840519/restful-wcf-post-issue-with-application-json-content-type-request

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!