2012-12-31 80 views
1

我希望我的WCF服務能夠返回multipart/form-data。儘管響應主體確實包含了所需內容,但當我想要查看Content-type:multipart/form-data時,響應標頭指示主體是application/octet-stream。如何從WCF服務中返回multipart/form-data作爲迴應

該代碼以下列單元測試開始。

[TestMethod, Owner(TEST_AUTHOR), TestCategory("MIME Testing")] 
    public void TempWcfService_PostMimeRequest_ExpectSuccess() 
    { 
     //Arrange 
     HttpClient client = new HttpClient(); 

     HttpMultipartMimeForm form = new HttpMultipartMimeForm(); 
     form.Add("Key1", "Value1"); 
     form.Add("Key2", "Value2"); 

     //Act 
     HttpResponseMessage response = client.Post(TEST_HOST_URL + "/mime-test", form.CreateHttpContent()); 
     response.EnsureStatusIsSuccessful(); 

     Stream responseStream = response.Content.ReadAsStream(); 
     string sResponse = responseStream.ToString(); 

     //Assert 
     Console.Write(sResponse); 
    } 

上述測試消耗了一個WCF服務,其接口如下所示。

namespace TempWcfService 
{ 
    /// <summary> 
    /// Interface added to support http without the WCF client class 
    /// </summary> 
    [ServiceContract] 
    public interface ITempPing 
    { 
     [OperationContract] 
     [WebInvoke(Method = "GET", UriTemplate = "ping")] 
     [Description("Pings the service for availability")] 
     string ping(); 

     [OperationContract] 
     [WebInvoke(UriTemplate = "mime-test", 
        Method = "POST", 
        BodyStyle = WebMessageBodyStyle.Bare)] 
     [Description("Tests a simple MIME request")] 
     Stream TestMultipartMime(Stream data); 

    } 
} 

和實現...

namespace TempWcfService 
{ 
    /// <summary> 
    /// Implementation added to support http without the WCF client class 
    /// </summary> 
    [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)] 
    [ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)] 
    public class TempPing : ITempPing 
    { 
     public string ping() 
     { 
      return "TempPing ping() successful"; 
     } 

     public Stream TestMultipartMime(Stream data) 
     { 
      // Re-construct the multipart/form-data content 
      MultipartFormData multipartFormData = new MultipartFormData(WebOperationContext.Current.IncomingRequest, data); 
      HttpMultipartMimeForm responseForm = new HttpMultipartMimeForm(multipartFormData.Items); 
      responseForm.Add("ErrorCode", "Success"); 
      responseForm.Add("ErrorMessage", "None"); 

      HttpResponseMessage responseMsg = new HttpResponseMessage(); 
      responseMsg.StatusCode = System.Net.HttpStatusCode.OK; 
      responseMsg.Content = responseForm.CreateHttpContent(); 
      responseMsg.Headers.Add("Accept", "multipart/form-data"); 
      responseMsg.Headers.ContentType = "multipart/form-data; boundary=" + multipartFormData.Boundary; 

      return responseMsg.Content.ReadAsStream(); 
     } 

    } 
} 

WCF似乎通過重寫的ContentType被「幫我」在代碼中指定,而基於「應用程序/八位字節流」內容類型使用ReadAsStream()返回內容。有沒有辦法讓Content-Type頭部指示multipart/form-data?

+0

這有幫助嗎? http://blogs.msdn.com/b/dotnetinterop/archive/2008/11/04/rest-in-wcf-varying-response-content-type-based-on-http-request-headers.aspx – Pete

回答

0

你需要設置在傳出上下文內容類型:

public Stream TestMultipartMime(Stream data) 
{ 
    // Re-construct the multipart/form-data content 
    MultipartFormData multipartFormData = new MultipartFormData(WebOperationContext.Current.IncomingRequest, data); 
    HttpMultipartMimeForm responseForm = new HttpMultipartMimeForm(multipartFormData.Items); 
    responseForm.Add("ErrorCode", "Success"); 
    responseForm.Add("ErrorMessage", "None"); 

    HttpResponseMessage responseMsg = new HttpResponseMessage(); 
    responseMsg.StatusCode = System.Net.HttpStatusCode.OK; 
    responseMsg.Content = responseForm.CreateHttpContent(); 

    WebOperationContext.Current.OutgoingResponse.ContentType = "multipart/form-data; boundary=" + multipartFormData.Boundary; 
    WebOperationContext.Current.OutgoingResponse.Headers["Accept"] = "multipart/form-data"; 

    return responseMsg.Content.ReadAsStream(); 
} 

注意,你不應該需要設置Accept頭中的響應 - 這頭被請求中使用讓客戶告訴服務器它想要接收哪些內容類型。

+0

Carlos - 非常感謝!這解決了我的問題。 –