Web API 修改格式化程序中的传入负载
Web API modify incoming payload in formatter
全部,
我正在尝试通过网络修改传入对象的负载 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
似乎是一个不同的请求,因为它不包含事件编号。
我有两个问题:
- 我这样做是否正确或有更好的方法吗?
- 如果我采用正确的方法,我如何获得提取事件编号的正确请求?
谢谢
我找到了解决方案,我现在使用的是 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;
}
}
全部,
我正在尝试通过网络修改传入对象的负载 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
似乎是一个不同的请求,因为它不包含事件编号。
我有两个问题:
- 我这样做是否正确或有更好的方法吗?
- 如果我采用正确的方法,我如何获得提取事件编号的正确请求?
谢谢
我找到了解决方案,我现在使用的是 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;
}
}