2016-08-03 1 views
0

Tous,L'API Web modifie la charge utile entrante dans le formateur

J'essaie de modifier la charge utile d'un objet entrant via l'API Web. Actuellement, j'utilise un formateur personnalisé qui hérite de JsonMediaTypeFormatter et remplace les méthodes appropriées.

ressemble à ceci:

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; 
    } 
} 

J'utilise ceci pour suivre chaque objet qui passe par l'API.

Avant tout cela, j'ai un MessageHandler qui crée un numéro d'événement et l'ajoute à Request.Properties.

L'obtention du numéro d'événement dans le formateur créé précédemment dans MessageHandler s'avère difficile. L'accès HttpContext.Current.Items["MS_HttpRequestMessage"].Properties semble être une requête différente car il ne contient pas le numéro de l'événement.

J'ai deux questions:

  1. Est-ce que je fais cela correctement le ou est-il une meilleure façon?
  2. Si je prends la bonne approche, comment obtenir la bonne demande pour extraire le numéro de l'événement?

Merci

Répondre

0

J'ai trouvé une solution, au lieu d'essayer de le faire dans un formatter J'utilise maintenant un ActionFilterAttribute.

remplaçant OnActionExecuting(HttpActionContext actionContext) et l'action actionContext.ActionArguments l'énumération.

La solution complète ressemble à ceci:

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; 
    } 
}