Обработка данных запроса 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"
в вашей конечной точке.
Вот так ваш сервис теперь будет захватывать все сообщения перед их десериализацией.