2016-08-03 2 views
0

Все,Веб-API изменить входящую полезную нагрузку в форматировании

Я пытаюсь изменить полезную нагрузку входящего объекта через веб-API. В настоящее время я использую собственный форматировщик, который наследует от JsonMediaTypeFormatter и переопределяет соответствующие методы.

выглядит так:

public override async Task<object> ReadFromStreamAsync(Type type, Stream readStream, HttpContent content, IFormatterLogger formatterLogger, 
    CancellationToken cancellationToken) 
{ 
    object obj = await base.ReadFromStreamAsync(type, readStream, content, formatterLogger, cancellationToken); 
    TrySetEventNo(obj, GetEventNo()); 
    return obj; 
} 

private void TrySetEventNo(object content, long eventNo) 
{ 
    if (content is EventModelBase) 
    { 
     EventModelBase eventBase = (EventModelBase)content; 
     eventBase.EventNo = eventNo; 
    } 
} 

Я использую это, чтобы отслеживать каждый объект, который приходит через API.

Прежде чем это произойдет, у меня есть MessageHandler, который создает номер события и добавляет его в Request.Properties.

Попытка получить номер события в форматировании, который был создан ранее в MessageHandler, оказывается затруднительным. Доступ HttpContext.Current.Items["MS_HttpRequestMessage"].Properties представляется другим запросом, так как он не содержит номер события.

Я два вопроса:

  1. Могу ли я сделать это корректно, или есть способ лучше?
  2. Если я использую правильный подход, как получить правильный запрос на извлечение номера события?

Благодаря

ответ

0

Я нашел решение, вместо того, чтобы пытаться сделать это в форматировщику я теперь с помощью ActionFilterAttribute.

переопределение OnActionExecuting(HttpActionContext actionContext) и перечисляющее действие actionContext.ActionArguments.

Комплексное решение выглядит так:

public class SetModelEventNumberActionFilter : ActionFilterAttribute 
{ 
    public override void OnActionExecuting(HttpActionContext actionContext) 
    { 

     foreach (KeyValuePair<string, object> actionArgument in actionContext.ActionArguments) 
     { 
      TrySetEventNo(actionArgument.Value, GetEventNo(actionContext)); 
     } 

     base.OnActionExecuting(actionContext); 
    } 
    private void TrySetEventNo(object content, long eventNo) 
    { 
     if (content is EventPivotRequestMessageBase) 
     { 
      EventPivotRequestMessageBase eventBase = (EventPivotRequestMessageBase)content; 
      eventBase.EventNo = eventNo; 
     } 
    } 

    private long GetEventNo(HttpActionContext actionContext) 
    { 

     long eventNo = (long)actionContext.Request.Properties[Constant.EVENT_ID]; 

     return eventNo; 
    } 
} 
Смежные вопросы