2

WCFサービスがmultipart/form-dataを返すようにしたい。応答本文には必要なコンテンツが含まれていますが、Content-type:multipart / form-dataを表示する場合、応答ヘッダーは本文がapplication/octet-streamであることを示します。

コードは、次の単体テストで始まります。

    [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は、ReadAsStream()を使用して返されたコンテンツに基づいて、コードで指定されたContentTypeを「application/octet-stream」のコンテンツタイプでオーバーライドすることで「私を助けて」いるようです。multipart / form-dataを示すContent-Typeヘッダーを取得する方法はありますか?

4

1 に答える 1

1

発信コンテキストでコンテンツ タイプを設定する必要があります。

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にヘッダーを設定する必要がないことに注意してください。このヘッダーは、クライアントが受信したいコンテンツ タイプをサーバーに伝える要求で使用されます。

于 2012-12-31T19:08:36.793 に答える