Изменить значение возврата в операции WCF - PullRequest
1 голос
/ 23 августа 2011

Я хочу убедиться, что все наши операции, которые возвращают наборы данных в нашем WCF, имеют значение .ExcludedSchema, установленное в свойстве SchemaSerializationMode.

Могу ли я сделать это с CustomBehavior?Я попытался реализовать CustomDispatchBehavior и добавить MessageInspector, но методы AfterReceiveRequest и BeforeSendReply не позволяют мне что-либо делать с возвращаемым значением.В BeforeSendreply возвращаемое значение уже было сериализовано.Где я могу вставить свой код?

    public class CustomDispatchBehavior : BehaviorExtensionElement, IServiceBehavior
    {

        public override Type BehaviorType
        {
            get { return typeof(CustomDispatchBehavior); }
        }

        protected override object CreateBehavior()
        {
            return new CustomDispatchBehavior();
        }

        void IServiceBehavior.AddBindingParameters(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase, System.Collections.ObjectModel.Collection<ServiceEndpoint> endpoints, BindingParameterCollection bindingParameters)
        {
            //throw new NotImplementedException();
        }

        void IServiceBehavior.ApplyDispatchBehavior(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase)
        {
            //throw new NotImplementedException();
            foreach (ChannelDispatcher chanDisp in serviceHostBase.ChannelDispatchers)
            {
                foreach (EndpointDispatcher ed in chanDisp.Endpoints)
                {
                    ed.DispatchRuntime.MessageInspectors.Add(new MyMessageInspector());

                }
            }
        }

        void IServiceBehavior.Validate(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase)
        {
            //throw new NotImplementedException();
        }

    }

Ответы [ 2 ]

1 голос
/ 23 августа 2011

Я решил это с помощью IParametorInspector

    void IServiceBehavior.ApplyDispatchBehavior(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase)
    {      

        foreach (ChannelDispatcher chDisp in serviceHostBase.ChannelDispatchers)
        {
            foreach (EndpointDispatcher epDisp in chDisp.Endpoints)
            {                   
                foreach (DispatchOperation op in epDisp.DispatchRuntime.Operations)
                    op.ParameterInspectors.Add(new DataSetParameterInspector());
            }
        }

    }

и инспектор выглядит так

public class DataSetParameterInspector : IParameterInspector
{

    public void AfterCall(string operationName, object[] outputs, object returnValue, object correlationState)
    {
        Type t =returnValue.GetType();
        if (t.IsSubclassOf(typeof(GlobalUtils.RR.Response)))
        {
            foreach (var pi in t.GetProperties())
            {
                if (pi.PropertyType.IsSubclassOf(typeof(System.Data.DataSet)))
                {
                    object parameter = pi.GetValue(returnValue, null);
                    if (parameter != null)
                        ((System.Data.DataSet)parameter).SchemaSerializationMode = System.Data.SchemaSerializationMode.ExcludeSchema;
                }
            }
        }
    }
1 голос
/ 23 августа 2011

Взгляните на интерфейс IDispatchMessageFormatter .Он определяет методы, которые десериализуют сообщения-запросы и сериализуют ответные сообщения в приложении-службе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...