我通过使用ExpandoObject作为参数,为我的Web.API项目创建了一种非常巧妙的实现PATCH方法的方法。如下图所示:
[HttpPatch, Route("api/employee/{id:int}")]
public IHttpActionResult Update(int id, [FromBody] ExpandoObject employee)
{
var source = Repository.FindEmployeeById(id);
Patch(employee, source);
Repository.SaveEmployee(source);
return Ok(source);
}
然而,在生成文档时,ApiExplorer对如何处理ExpandoObject感到茫然,这是完全可以理解的。有人会对如何操纵ApiExplorer以提供一些合理的文档有任何想法吗?
我的想法是引入一个新属性,该属性指向预期的实际类型:
public IHttpActionResult Update(int id, [FromBody, Mimics(typeof(Employee))] ExpandoObject employee)
{
...
}
但我不知道从哪里开始,欢迎任何想法或建议。
答案 0 :(得分:0)
因此,为了让Api Explorer与我们开发的Http Patch机制一起发挥作用,这已成为一些晚上的源头。说实话,我可能应该做一些正确的写作,以全面解释整个想法背后的机制。但对于那些因为你希望Api资源管理器在文档中使用不同类型而登陆此页面的人来说,这是你需要查看的地方:
打开HelpPageConfigurationExtensions.cs并找到以下方法:
//File: Areas/HelpPage/HelpPageConfigurationExtensions.cs
private static void GenerateRequestModelDescription(HelpPageApiModel apiModel, ModelDescriptionGenerator modelGenerator, HelpPageSampleGenerator sampleGenerator)
{
....
}
这是您可以使用参数信息的位置,还为您提供了用其他内容替换/替换参数信息的功能。我最终执行以下操作来处理我的ExpandoObject参数问题:
if (apiParameter.Source == ApiParameterSource.FromBody)
{
Type parameterType = apiParameter.ParameterDescriptor.ParameterType;
// do something different when dealing with parameters
// of type ExpandObject.
if (parameterType == typeof(ExpandoObject))
{
// if a request-type-attribute is defined, assume the parameter
// is the supposed to mimic the type defined.
var requestTypeAttribute = apiParameter.ParameterDescriptor.GetCustomAttributes<RequestTypeAttribute>().FirstOrDefault();
if (requestTypeAttribute != null)
{
parameterType = requestTypeAttribute.RequestType;
}
}
}
请注意,RequestTypeAttribute是我设计的。我的WebApi端点现在看起来像这样:
public IHttpActionResult Update(int id,
[FromBody, RequestType(typeof(Employee))] ExpandoObject employee)
感谢所有花时间研究这个问题的人。