0

全て、

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イベント番号が含まれていないため、アクセスは別のリクエストのようです。

2 つの質問があります。

  1. 私はこれを正しく行っていますか、それともより良い方法がありますか?
  2. 正しいアプローチを取っている場合、イベント番号を抽出するための正しいリクエストを取得するにはどうすればよいですか?

ありがとう

4

1 に答える 1

0

現在使用しているフォーマッタ内でこれを行うのではなく、解決策を見つけましたActionFilterAttribute

action のオーバーライド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;
    }
}
于 2016-08-03T09:50:04.963 に答える