我希望我的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?
這有幫助嗎? http://blogs.msdn.com/b/dotnetinterop/archive/2008/11/04/rest-in-wcf-varying-response-content-type-based-on-http-request-headers.aspx – Pete