2012-12-12 101 views
1

我用下面POST「操作」配置REST風格的WCF:寧靜的WCF POST問題

[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的」 一個POST消息「JSON」一切工作正常。 然而,當我嘗試發送POST消息 的ContentType =「應用/ JSON」 它失敗,出現以下消息: 遠程服務器返回一個錯誤:(400)錯誤的請求

的我找到的唯一解決方案是定義Factory類:System.ServiceModel.Activation.WebServiceHostFactory int Svc定義標記。

我發現下面的鏈接此解決方案: Send JSON to WCF 3.5 using Ajax

我的理解,如果你不想編輯web.config定義WebServiceHostFactory纔有用。

如何在不定義WebServiceHostFactory的情況下使其工作?

請注意,我成功獲取「json」內容類型的POST消息,但未獲取「application/json」內容類型。

回答

3

問題是,要使用原始編程模型(使用Stream參數),您需要告訴WCF不要試圖將請求理解爲JSON,而只是將原始請求主體傳遞給參數。你可以使用WebContentTypeMapper來做到這一點。 http://blogs.msdn.com/b/carlosfigueira/archive/2008/04/17/wcf-raw-programming-model-receiving-arbitrary-data.aspx的帖子顯示瞭如何做到這一點。工廠解決方案的工作原理是因爲它在創建端點時會這樣做。