繁体   English   中英

ASP.NET Web API帮助页面无法处理通用类型控制器

[英]ASP.NET Web API Help Page can't process Generic Type Controller

我有一个关于ASP.NET Web API HelpPages的问题。

通常,HelpPages可以通过XMLDocumentation示例代码生成WebAPI:

public class ValueControllerBase : ApiController
{
    /// <summary>
    /// Base Do
    /// </summary>
    public IEnumerable<string> Do()
    {
       return new string[] { "value1", "value2" };
    }
}

public class ValuesController : ValueControllerBase
{
    /// <summary>
    /// Testing API
    /// </summary>
    public string Get(int id)
    {
        return "value";
    }
}

这可以成功生成,如下所示:

API
GET api/Values/Get/{id}

Description
Testing API

API
POST api/Values/Do

Description
Base Do

但如果我使用通用基本控制器,它将不会生成API文档。

样品:

public class ValueControllerBase<T> : ApiController
{
    /// <summary>
    /// Base Do
    /// </summary>
    public IEnumerable<string> Do()
    {
        return new string[] { "value1", "value2" };
    }
}

public class ValuesController<String> : ValueControllerBase
{
    /// <summary>
    /// Testing API
    /// </summary>
    public string Get(int id)
    {
        return "value";
    }
}

如果我在第二部分使用代码,HelpPages可以生成API文档,但不生成API注释。 我的两个例子之间的区别只是第二部分代码使用泛型类型。

API
GET api/Values/Get/{id}  

Description
Testing API

API
POST api/Values/Do

Description
null

在方法Do() ,注释与第一个相比不显示

有没有解决这些问题的解决方案?

我能够通过调整XmlDocumentationProvider一些代码来解决这个问题。

XmlDocumentationProvider.GetTypeName(Type)的原始实现如下:

private static string GetTypeName(Type type)
{
    string name = type.FullName;
    if (type.IsGenericType)
    {
        // Format the generic type name to something like: Generic{System.Int32,System.String}
        Type genericType = type.GetGenericTypeDefinition();
        Type[] genericArguments = type.GetGenericArguments();
        string genericTypeName = genericType.FullName;

        // Trim the generic parameter counts from the name
        genericTypeName = genericTypeName.Substring(0, genericTypeName.IndexOf('`'));
        string[] argumentTypeNames = genericArguments.Select(t => GetTypeName(t)).ToArray();
        name = String.Format(CultureInfo.InvariantCulture, "{0}{{{1}}}", genericTypeName, String.Join(",", argumentTypeNames));
    }
    if (type.IsNested)
    {
        // Changing the nested type name from OuterType+InnerType to OuterType.InnerType to match the XML documentation syntax.
        name = name.Replace("+", ".");
    }

    return name;
}

我不知道为什么,但是他们尝试为xml查找创建类型名称以包含实际的泛型属性,而不是泛型类型名称本身(例如,它们创建Nullable {bool}而不是Nullable`1)。 在xml文件中只定义了通用名称本身。

对代码的简单更改使其能够正确地命名/引用泛型类的文档:

....
if (type.IsGenericType)
{
    Type genericType = type.GetGenericTypeDefinition();
    name = genericType.FullName;
}
....

在进行了更改之后,注释开始正确地显示为泛型类型,对我来说,这也没有破坏其他任何东西。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM