2016-08-03 40 views
0

全部,Web API修改格式器中的傳入負載

我試圖通過Web 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; 
    } 
}