WCF предоставляет множество расширяемых точек одна из них - функция MessageInspector. Вы можете создать персонализированный инспектор сообщений для получения запроса до того, как он де-сериализуется на объект C#. И делайте то, что когда-либо можете с данными необработанного запроса.
Для его осуществления Вам необходимо реализовать System.ServiceModel.Dispatcher.IDispatchMessageInspector
интерфейс, как показано ниже:
public class IncomingMessageLogger : IDispatchMessageInspector
{
const string MessageLogFolder = @"c:\temp\";
static int messageLogFileIndex = 0;
public object AfterReceiveRequest(ref Message request, IClientChannel channel, InstanceContext instanceContext)
{
string messageFileName = string.Format("{0}Log{1:000}_Incoming.txt", MessageLogFolder, Interlocked.Increment(ref messageLogFileIndex));
Uri requestUri = request.Headers.To;
HttpRequestMessageProperty httpReq = (HttpRequestMessageProperty)request.Properties[HttpRequestMessageProperty.Name];
// Decode the message from request and do whatever you want to do.
string jsonMessage = this.MessageToString(ref request);
return requestUri;
}
public void BeforeSendReply(ref Message reply, object correlationState)
{
}
}
Вот полный code snippet gist. Actual source.
Теперь вам нужно добавить инспектора этого сообщения в режим конечной точки. Для достижения этой цели вы будете реализации System.ServiceModel.Description.IEndpointBehavior
интерфейса, как показано ниже:
public class InsepctMessageBehavior : IEndpointBehavior
{
public void AddBindingParameters(ServiceEndpoint endpoint, BindingParameterCollection bindingParameters)
{
}
public void ApplyClientBehavior(ServiceEndpoint endpoint, ClientRuntime clientRuntime)
{
}
public void ApplyDispatchBehavior(ServiceEndpoint endpoint, EndpointDispatcher endpointDispatcher)
{
endpointDispatcher.DispatchRuntime.MessageInspectors.Add(new IncomingMessageLogger());
}
public void Validate(ServiceEndpoint endpoint)
{
}
}
Теперь, если вы на selfhosting т.е. Вы принимаете ваше обслуживание программно вы можете напрямую подключить это недавно реализованное поведение вашей конечной точки службы. Например.
endpoint.Behaviors.Add(new IncomingMessageLogger());
Но если вы принимали службу WCF Rest в IIS, то вы бы инъекционном новое поведение с помощью конфигурации. Для достижения этой цели необходимо создать дополнительный класс, производный от BehaviorExtensionElement
:
public class InspectMessageBehaviorExtension : BehaviorExtensionElement
{
public override Type BehaviorType
{
get { return typeof(InsepctMessageBehavior); }
}
protected override object CreateBehavior()
{
return new InsepctMessageBehavior();
}
}
Теперь в конфигурации первым зарегистрировать поведение под system.servicemodel
тега:
<extensions>
<behaviorExtensions>
<add name="inspectMessageBehavior"
type="WcfRestAuthentication.MessageInspector.InspectMessageBehaviorExtension, WcfRestAuthentication"/>
</behaviorExtensions>
</extensions>
Теперь добавьте такое поведение к поведению Endpoint :
<endpointBehaviors>
<behavior name="defaultWebHttpBehavior">
<inspectMessageBehavior/>
<webHttp defaultOutgoingResponseFormat="Json"/>
</behavior>
</endpointBehaviors>
установить атрибут behaviorConfiguration="defaultWebHttpBehavior"
в конечной точке.
Это ваша служба теперь захватит все сообщения, прежде чем десериализовать их.
Итак, объекты objColor & objdelcolor находятся в правильной форме JSON, и вам просто нужно их проанализировать на C#? Или я что-то упустил здесь – Piyush
Нет, они не соответствуют формату C#. Мне просто нужно фактическое сообщение запроса (формат JSON), что клиент отправляет мне. – Venki