【问题标题】:ASP.NET Web API Help Page can't process Generic Type ControllerASP.NET Web API 帮助页面无法处理通用类型控制器
【发布时间】:2014-12-20 01:08:34
【问题描述】:

我有一个关于 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()方法中,与第一个相比,注解不显示

有没有办法解决这些问题?

【问题讨论】:

    标签: c# asp.net-web-api asp.net-web-api-helppages


    【解决方案1】:

    我可以通过调整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;
    }
    ....
    

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

    【讨论】:

    • 另一方面,这会破坏获取具有可为空参数的方法的文档。
    • @MotlicekPetr 我已经实现了这个,但我没有看到它破坏了可空参数文档。你有例子吗?
    猜你喜欢
    • 2014-10-11
    • 2015-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多