2014-10-03 4 views
1

웹 API 도움말 페이지를 사용하고 있으며 다른 방법에 대한 링크를 포함하고 싶습니다. 나는 Are XML documentation tags not being handled by Web API 2 help pages?에서 < 참조 cref = '...'을 보았습니다. >은 지원되지 않습니다.ASP 웹 API 도움말 페이지 - 다른 페이지에 대한 링크

내 자신의 < A HREF를 작성하는 것보다 더 좋은 옵션이 '...'= 문서에 > 링크이 있고, 도움 이러한 < > 태그 출력을 얻을 수 Web Api Help Page- don't escape html in xml documentation에 기술 된 방법을 사용하여? 그것은 미래의 변화에 ​​매우 취약한 것으로 보입니다.

내가 생각할 수있는 유일한 대안은 API 탐색기를 두 번 실행하는 것입니다. 한 번만 모든 다른 경로를 캐시하기 위해 & 해당하는 도움말 페이지 URL과 실제로 문서를 생성하는 두 번째 시간입니다. 하지만 어디서 접속할 지 모르겠다. (가능하다면)

답변

4

링크를 올바르게 변환하는 글을 쓸 수 있었다.

개요는 다음과 같습니다 (예 : M CREF에있는 문자열 사이에 새로운 게으른 IDictionary 맵핑을 작성 도움말 컨트롤러의 생성자에서

: Api.Method.Description (선택 System.String를) 및 관련 ApiDescription

. 페이지를 다시 다양한 모델이 게으른이 (당신이 여분의 모델을 만들어야 할 수도 있습니다)
 _methodReferences = new Lazy<IDictionary<string, ApiDescription>>(() => { 
      var dictionary = new Dictionary<string, ApiDescription>(); 

      var apiExplorer = new ApiExplorer(config); 

      foreach (var apiDescription in apiExplorer.ApiDescriptions) 
      { 
       var descriptor = apiDescription.ActionDescriptor as ReflectedHttpActionDescriptor; 
       if (descriptor != null) 
       { 
        var methodName = string.Format(
         @"M:{0}.{1}({2})", 
         descriptor.MethodInfo.DeclaringType.FullName, 
         descriptor.MethodInfo.Name, 
         string.Join(@",",descriptor.GetParameters().Select(x => x.ParameterType.FullName)) 
         ); 
        dictionary[methodName] = apiDescription; 
       } 

      } 
      return dictionary; 
     }); 

패스 다음 코드로 모든 기본 클래스를 준 :

public abstract class HelpPageModelBase 
{ 
    private static Regex _seeRegex = new Regex("<see cref=\"([^\"]+)\" />"); 
    private readonly Lazy<IDictionary<string, ApiDescription>> _methodReferences; 

    protected HelpPageModelBase(Lazy<IDictionary<string, ApiDescription>> methodReferences) 
    { 
     _methodReferences = methodReferences; 
    } 

    protected HelpPageModelBase(HelpPageModelBase parent) 
    { 
     _methodReferences = parent._methodReferences; 
    } 

    public string ParseDoc(string documentation, UrlHelper url) 
    { 
     if (documentation == null) 
     { 
      return null; 
     } 
     return _seeRegex.Replace(documentation, 
           match => { 
            if (_methodReferences.Value.ContainsKey(match.Groups[1].Value)) 
            { 
             var descriptor = _methodReferences.Value[match.Groups[1].Value]; 

             return string.Format(@"<a href='{0}'>{1} {2}</a>", 
                   url.Action("Api", 
                     "Help", 
                     new { 
                      apiId = descriptor.GetFriendlyId() 

                     }), 
                   descriptor.HttpMethod.Method, 
                   descriptor.RelativePath 
              ); 
            } 
            return ""; 
           }); 
    } 
} 
이미 Web Api Help Page- don't escape html in xml documentation을 따라 한 경우 또는 Html.Raw(api.Documentation) - - 어느 곳 api.Documentation.Trim() 있던 뷰에서

지금 포장은 그래서 당신은 다양한 ModelDescriptions이 HelpPageModelBase에서 상속해야이 작업을 수행하는 것을 발견 할 것이다

@Html.Raw(Model.ParseDoc(api.Documentation, Url)) 

된다 - 그들에게 부모 API 모델을 넘겨 주지만 (또는 더 쉬운 경우라면 Lazy) 결국 작동합니다.

저는이 솔루션에 만족하지 않습니다. 기본 Http Configuration을 사용하여 Lazy를 생성하는 정적 인 ParseDoc 메서드를 사용하는 것이 더 쉬울 수도 있습니다 (그러나 필자가 만든 다른 확장 기능으로 인해 제 경우에는 작동하지 않습니다). 더 좋은 방법이 있다면 공유하십시오! 잘하면 그것은 당신에게 출발점을 제공합니다.