0

WCF REST サービスでは、Accept HTTP ヘッダーで指定された値に基づいて、JSON と XML の間で応答のシリアル化を切り替えています。ここで説明されているように、IDispatchMessageFormatter を使用しています - http://damianblog.com/2008/10/31/wcf-rest-dynamic-response/

PUT と POST に Content-Type を使用していますが、PUT と POST の場合、IDispatchMessageFormatter.SerializeReply 自体は実行されません。

唯一の問題は、これが GET リクエストに対してのみ機能し、PUT、POST、DELETE などに対しては機能しないことです。理由を知っている人はいますか? または、ここで非常に基本的なものが欠けています:)

ありがとう。

4

2 に答える 2

1

わかりました問題は解決しました.....現在のコードは WebGetAttribute のみを処理していました:

class WebHttpBehavior2Ex : WebHttpBehavior
{
    protected override IDispatchMessageFormatter GetReplyDispatchFormatter(OperationDescription operationDescription, 
                                                                           ServiceEndpoint endpoint)
    {
        WebGetAttribute webGetAttribute = operationDescription.Behaviors.Find<WebGetAttribute>();
        DynamicResponseTypeAttribute mapAcceptedContentTypeToResponseEncodingAttribute = 
            operationDescription.Behaviors.Find<DynamicResponseTypeAttribute>();

        if (webGetAttribute != null && mapAcceptedContentTypeToResponseEncodingAttribute != null) {
            // We need two formatters, since we don't know what type we will need until runtime
            webGetAttribute.ResponseFormat = WebMessageFormat.Json;
            IDispatchMessageFormatter jsonDispatchMessageFormatter = 
                base.GetReplyDispatchFormatter(operationDescription, endpoint);
            webGetAttribute.ResponseFormat = WebMessageFormat.Xml;
            IDispatchMessageFormatter xmlDispatchMessageFormatter = 
                base.GetReplyDispatchFormatter(operationDescription, endpoint);
            return new DynamicFormatter() { 
                jsonDispatchMessageFormatter = jsonDispatchMessageFormatter, 
                xmlDispatchMessageFormatter = xmlDispatchMessageFormatter };
        }
        return base.GetReplyDispatchFormatter(operationDescription, endpoint);
    }
}

代わりに、以下のように WebGet 属性と WebInvoke 属性の両方を処理する必要があります。

public class WebHttpBehaviorEx : WebHttpBehavior
{
    protected override IDispatchMessageFormatter GetReplyDispatchFormatter(OperationDescription operationDescription,
                                                                           ServiceEndpoint endpoint)
    {
        WebGetAttribute webGetAttribute = operationDescription.Behaviors.Find<WebGetAttribute>();
        WebInvokeAttribute webInvokeAttr = operationDescription.Behaviors.Find<WebInvokeAttribute>();
        DynamicResponseTypeAttribute mapAcceptedContentTypeToResponseEncodingAttribute =
            operationDescription.Behaviors.Find<DynamicResponseTypeAttribute>();

        if (webGetAttribute != null && mapAcceptedContentTypeToResponseEncodingAttribute != null)
        {
            // We need two formatters, since we don't know what type we will need until runtime
            webGetAttribute.ResponseFormat = WebMessageFormat.Json;
            IDispatchMessageFormatter jsonDispatchMessageFormatter =
                base.GetReplyDispatchFormatter(operationDescription, endpoint);
            webGetAttribute.ResponseFormat = WebMessageFormat.Xml;
            IDispatchMessageFormatter xmlDispatchMessageFormatter =
                base.GetReplyDispatchFormatter(operationDescription, endpoint);
            return new DynamicFormatter()
            {
                jsonDispatchMessageFormatter = jsonDispatchMessageFormatter,
                xmlDispatchMessageFormatter = xmlDispatchMessageFormatter
            };
        }
        else if (webInvokeAttr != null && mapAcceptedContentTypeToResponseEncodingAttribute != null)
        {
            // We need two formatters, since we don't know what type we will need until runtime
            webInvokeAttr.ResponseFormat = WebMessageFormat.Json;
            IDispatchMessageFormatter jsonDispatchMessageFormatter =
                base.GetReplyDispatchFormatter(operationDescription, endpoint);
            webInvokeAttr.ResponseFormat = WebMessageFormat.Xml;
            IDispatchMessageFormatter xmlDispatchMessageFormatter =
                base.GetReplyDispatchFormatter(operationDescription, endpoint);
            return new DynamicFormatter()
            {
                jsonDispatchMessageFormatter = jsonDispatchMessageFormatter,
                xmlDispatchMessageFormatter = xmlDispatchMessageFormatter
            };
        }
        return base.GetReplyDispatchFormatter(operationDescription, endpoint);
    }
}
于 2013-08-28T04:28:37.260 に答える