Обработка данных запроса Json в методе POST службы WCF REST

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

Мой код:

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

1 ответ

Решение

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)
    {
    }
}

Вот полный кодовый фрагмент кода. Актуальный источник.

Теперь вам нужно добавить этот инспектор сообщений для поведения конечной точки. Чтобы добиться этого, вы будете осуществлять 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)
    {
    }
}

Теперь, если вы используете самохостинг, то есть программно размещаете свой сервис, вы можете напрямую присоединить это недавно реализованное поведение к конечной точке вашего сервиса. Например

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>

Теперь добавьте это поведение к поведению конечной точки:

  <endpointBehaviors>
    <behavior name="defaultWebHttpBehavior">
      <inspectMessageBehavior/>
      <webHttp defaultOutgoingResponseFormat="Json"/>
    </behavior>
 </endpointBehaviors>

установить атрибут behaviorConfiguration="defaultWebHttpBehavior" в вашей конечной точке.

Вот так ваш сервис теперь будет захватывать все сообщения перед их десериализацией.

Другие вопросы по тегам