Web API修改格式化程序中的传入有效内容

时间:2016-08-03 07:37:11

标签: c# asp.net-web-api mediatypeformatter message-handlers

所有

我正在尝试通过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. 如果我采取正确的方法,如何获得正确的提取事件编号的请求?
  3. 由于

1 个答案:

答案 0 :(得分: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;
    }
}