即使没有请求参数,Web API 参数绑定返回实例
本文关键字:参数 API 绑定 返回 实例 Web 请求 | 更新日期: 2023-09-27 17:55:16
with ASP.NET 的 WebApi,如何确保始终实例化复杂的 Action 参数? 即使没有请求参数(在查询字符串或 POST 正文中)。
例如,给定此虚拟操作定义:
public IHttpActionResult GetBlahBlah(GetBlahBlahInput input) { .. }
我希望input
始终是GetBlahBlahInput
的实例化实例。 默认行为是,如果请求参数存在于请求中的任何位置,则input
不为 null(即使没有任何请求参数可绑定到GetBlahBlahInput
。 但是,如果未发送任何参数,则GetBlahBlahInput
null
。 我不想null
,我想要一个用无参数构造函数创建的实例。
基本上,我正在尝试实现这一点:
http://dotnet.dzone.com/articles/interesting-json-model-binding
在 WebApi 土地上(所以没有DefaultModelBinder
继承),我希望它是通用的,所以它可以处理任何输入类型。
我在WebApi中使用默认的JsonMediaFormatter支持。
有什么想法吗? 我很确定它可以完成,但我可能在某处错过了一个简单的配置步骤。
我仍然想知道我问的事情是否可以完成。 但就目前而言,这是我在 ActionFilterAttribute 中实现的解决方法(inputKey
参数的名称;在原始问题中它是input
):
// look for the "input" parameter and try to instantiate it and see if it implements the interface I'm interested in
var parameterDescriptor = actionContext.ActionDescriptor.GetParameters().FirstOrDefault(p => string.Compare(p.ParameterName, inputKey, StringComparison.InvariantCultureIgnoreCase) == 0);
if (parameterDescriptor == null
|| (inputArgument = Activator.CreateInstance(parameterDescriptor.ParameterType) as IHasBlahBlahId) == null)
{
// if missing "input" parameter descriptor or it isn't an IHasBlahBlahId, then return unauthorized
actionContext.Response = new HttpResponseMessage(HttpStatusCode.Unauthorized);
return;
}
// otherwise, take that newly instantiated object and throw it into the ActionArguments!
if (actionContext.ActionArguments.ContainsKey(inputKey))
actionContext.ActionArguments[inputKey] = inputArgument;
else
actionContext.ActionArguments.Add(inputKey, inputArgument);