2015-10-26 3 views
1

Я создаю службу REST с методом POST и OBJECT в качестве входного параметра. в то время как запрос клиента не может получить фактический клиент данных JSON. Есть ли способ выкопать код JSON из службы WCF C#.Ручка Json Запросить данные в WCF REST Service POST метод

Мой код:

namespace ACTService 
{ 
    public class AssortmentService : IAssortmentService 
    { 
    public void DeleteColor(DeleteColorContarct objdelcolor) 
    { 
     new Methods.ColorUI().DeleteColorDetails(objdelcolor); 
    } 
    } 
} 

и мой интерфейс, как

namespace ACTService 
{ 
    [ServiceContract] 
    public interface IAssortmentService 
    { 
    [OperationContract] 
    [WebInvoke(UriTemplate = "DeleteColor", Method = "POST", ResponseFormat = WebMessageFormat.Json, RequestFormat = WebMessageFormat.Json,BodyStyle=WebMessageBodyStyle.Wrapped)] 
    void DeleteColor(DeleteColorContarct objColor); 
    } 
} 

Мне нужно получить доступ к формату JSON в другом файле класса ColorUI

+0

Итак, объекты objColor & objdelcolor находятся в правильной форме JSON, и вам просто нужно их проанализировать на C#? Или я что-то упустил здесь – Piyush

+0

Нет, они не соответствуют формату C#. Мне просто нужно фактическое сообщение запроса (формат JSON), что клиент отправляет мне. – Venki

ответ

2

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" в конечной точке.

Это ваша служба теперь захватит все сообщения, прежде чем десериализовать их.

Смежные вопросы