2014-06-22 6 views
8

ASP.NET 웹 API 도움말 페이지에 대한 질문이 있습니다.ASP.NET 웹 API 도움말 페이지에서 일반 형식 컨트롤러를 처리 할 수 ​​없습니다.

API 
GET api/Values/Get/{id} 

Description 
Testing API 

API 
POST api/Values/Do 

Description 
Base Do 

을하지만 일반적인 기본 컨트롤러를 사용하는 경우, 그것은하지 않습니다 :

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"; 
    } 
} 

는이 같은 성공적으로 생성 할 수 있습니다

보통 HelpPages는 XMLDocumentation 샘플 코드로 WebAPI를 생성 할 수 있습니다 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 주석을 생성하지 않습니다. 두 예제의 차이점은 두 번째 섹션 코드가 제네릭 형식을 사용한다는 것입니다. 방법 Do()에서

API 
GET api/Values/Get/{id} 

Description 
Testing API 

API 
POST api/Values/Do 

Description 
null 

, 주석 이러한 문제를 해결하기 위해 어떤 해결책이 첫 번째

에 비해 표시하지 않는 이유는 무엇입니까?

답변

12

XmlDocumentationProvider에서 일부 코드를 조정하여이 문제를 해결할 수있었습니다.

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 조회를위한 유형 이름을 만들려고 :

XmlDocumentationProvider.GetTypeName(Type)의 원래 실현하는 것이는 다음과 (예를 들어, Nullable {1} 대신 Nullable {bool}을 만듭니다. 일반 이름 자체 만 xml 파일에 정의됩니다.

코드에 간단한 변화가 제대로 일반 클래스의 이름/레퍼런스 문서를 그것을 가져옵니다

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

그 변경 한 후 주석이 제네릭 형식에 대해 올바르게 표시하기 시작하고 나를 위해, 이것은 다른 것을 깨뜨리지도 않았다.

+0

한편, 이것은 nullable 매개 변수가있는 메소드에 대한 문서를 얻지 못하게합니다. –

+0

@MotlicekPetr이 구현되어 있지만 nullable 매개 변수 설명서를 깨는 것을 보지 않을거야. 모범이 있습니까? –