如何寻求ApiExplorer为ExpandoObject创建文档?

时间:2016-02-17 09:11:08

标签: asp.net-web-api asp.net-mvc-apiexplorer

我通过使用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) 
{ 
    ... 
}

但我不知道从哪里开始,欢迎任何想法或建议。

1 个答案:

答案 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)

感谢所有花时间研究这个问题的人。