Изменить значение возврата в операции WCF
Я хочу убедиться, что все наши операции, которые возвращают наборы данных в нашем 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 ответа
Решение
Я решил это с помощью 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;
}
}
}
}
Взгляните на интерфейс IDispatchMessageFormatter. Он определяет методы, которые десериализуют сообщения запроса и сериализуют ответные сообщения в приложении-службе.