2016-08-03 10 views
0

すべて、Web APIはフォーマッタで受信ペイロードを変更します

Web API経由で着信オブジェクトのペイロードを変更しようとしています。現在私はJsonMediaTypeFormatterから継承し、関連するメソッドをオーバーライドするカスタムフォーマッタを使用しています。

は次のようになります。私は、APIを介して来るすべてのオブジェクトを追跡するために、これを使用してい

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

このようなことが起こる前に、私はイベント番号を作成してそれをRequest.Propertiesに追加しているMessageHandlerを持っています。

以前にMessageHandlerで作成されたフォーマッタのイベント番号を取得しようとするのは困難です。アクセス番号HttpContext.Current.Items["MS_HttpRequestMessage"].Propertiesは、イベント番号が含まれていないため、別の要求のようです。

私は2つの質問がきました:

  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; 
    } 
} 
関連する問題