<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      ASP.NET Web API RC版本新特性:Web API的幫助文檔制作

      InfoQ上有一篇文章是 使用IAPIExplorer列舉ASP.NET Web API,文章針對的版本是ASP.NET Web API Beta版本寫,IAPIExplorer已經包含在RC版本里了,而且發現ASP.NET Web API的HttpConfiguration 的RC版本比Beta版本多了一個屬性:

      public DefaultServices Services { get; internal set; }

      Debug進去可以看到默認有18個服務,IAPIExplorer 就是其中之一:

      image

      使用該API可以完成的工作有:

      • 產生文檔
      • 創建機器可讀的元數據
      • 創建一個測試客戶端

      微軟員工Yao發表了兩篇文章(ASP.NET Web API: Introducing IApiExplorer/ApiExplorerASP.NET Web API: Generating a Web API help page using ApiExplorer)分別用于展示如何使用API打印Web API列表以及如何創建幫助文檔。

      所以我們創建幫助文檔主要就是參照這篇文章就可以了ASP.NET Web API: Generating a Web API help page using ApiExplorer;作者在文章里面已經實現了一個IDocumentationProvider,它是通過代碼的注釋XML文檔去生成,這是一個非常好的實現了:

      public class XmlCommentDocumentationProvider : IDocumentationProvider 
          {
              XPathNavigator _documentNavigator;
              private const string _methodExpression = "/doc/members/member[@name='M:{0}']";
              private static Regex nullableTypeNameRegex = new Regex(@"(.*\.Nullable)" + Regex.Escape("`1[[") + "([^,]*),.*");
              public XmlCommentDocumentationProvider(string documentPath)
              {
                  XPathDocument xpath = new XPathDocument(documentPath);
                  _documentNavigator = xpath.CreateNavigator();
              } 
              public virtual string GetDocumentation(HttpParameterDescriptor parameterDescriptor) 
          {
              ReflectedHttpParameterDescriptor reflectedParameterDescriptor = parameterDescriptor as ReflectedHttpParameterDescriptor;
                  if (reflectedParameterDescriptor != null)
                  { 
                      XPathNavigator memberNode = GetMemberNode(reflectedParameterDescriptor.ActionDescriptor);
                      if (memberNode != null)
                      { 
                          string parameterName = reflectedParameterDescriptor.ParameterInfo.Name;
                          XPathNavigator parameterNode = memberNode.SelectSingleNode(string.Format("param[@name='{0}']", parameterName));
                          if (parameterNode != null)
                          { 
                              return parameterNode.Value.Trim();
                          } 
                      } 
                  }
                  return "No Documentation Found.";
              } 
              public virtual string GetDocumentation(HttpActionDescriptor actionDescriptor)
              { 
                  XPathNavigator memberNode = GetMemberNode(actionDescriptor);
                  if (memberNode != null)
                  { 
                      XPathNavigator summaryNode = memberNode.SelectSingleNode("summary");
                      if (summaryNode != null)
                      { 
                          return summaryNode.Value.Trim();
                      } 
                  } 
                  return "No Documentation Found.";
              } 
              private XPathNavigator GetMemberNode(HttpActionDescriptor actionDescriptor)
              {
                  ReflectedHttpActionDescriptor reflectedActionDescriptor = actionDescriptor as ReflectedHttpActionDescriptor;
                  if (reflectedActionDescriptor != null)
                  { 
                      string selectExpression = string.Format(_methodExpression, GetMemberName(reflectedActionDescriptor.MethodInfo));
                      XPathNavigator node = _documentNavigator.SelectSingleNode(selectExpression);
                      if (node != null)
                      {
                          return node;
                      } 
                  } 
                  return null;
              } 
              private static string GetMemberName(MethodInfo method)
              {
                  string name = string.Format("{0}.{1}", method.DeclaringType.FullName, method.Name); 
                  var parameters = method.GetParameters();
                  if (parameters.Length != 0) 
                  { 
                      string[] parameterTypeNames = parameters.Select(param => ProcessTypeName(param.ParameterType.FullName)).ToArray();
                      name += string.Format("({0})", string.Join(",", parameterTypeNames));
                  }
                  return name;
              } 
              private static string ProcessTypeName(string typeName) 
              {
                  //handle nullable
                  var result = nullableTypeNameRegex.Match(typeName);
                  if (result.Success)
                  {
                      return string.Format("{0}{{{1}}}", result.Groups[1].Value, result.Groups[2].Value);
                  } 
                  return typeName;
              } 
          }

      把XML 文檔的位置在Application_Start 中將IDocumentationProvider服務替換為我們的自定義服務。

      var config = GlobalConfiguration.Configuration;
      config.Services.Replace(typeof(IDocumentationProvider), new XmlCommentDocumentationProvider(HttpContext.Current.Server.MapPath("~/App_Data/MvcApplication2.XML")));

      有個ApiExplorerSettingsAttribute 可以控制API是否在幫助頁面上出現:

      /// <summary>
      /// DELETE api/values/5
      /// </summary>
      /// <param name="id"></param> 
      [ApiExplorerSettings(IgnoreApi = true)]
      public void Delete(int id)
      {
      }

      還可以控制整個ApiController 的文檔是否發布出來,只需要通過在類級別應用ApiExplorerSettingsAttribute

       [ApiExplorerSettings(IgnoreApi = true)]
       public class MySpecialController : ApiController

      通過IAPIExplorer 這個API我們可以為我們的Web API 做出很棒的文檔了,而且這個接口的設計也是可擴展的。可以制作Web頁面也可以制作一個HelpController來做,推薦封裝成一個HelpController,這樣就可以適應WebAPi的Web Host或者是Self Host了。 

      Part 1: Basic Help Page customizations

      Changing the help page URI

      Providing API documentations

      Customizing the view

      Part 2: Providing custom samples on the Help Page

      Setting custom sample objects

      Setting the samples when the action returns an HttpResponseMessage

      Part 3: Advanced Help Page customizations

      Adding additional information to the HelpPageApiModel

      Creating new sample display templates

      Making ASP.NET Web API Help Page work on self-hosted services

      Extending Web API Help Page with information from attributes

      Using curl to POST request into ASP.NET Web Api service

      posted @ 2012-06-02 23:18  張善友  閱讀(6029)  評論(3)    收藏  舉報
      主站蜘蛛池模板: xxxx丰满少妇高潮| 毛片网站在线观看| 亚洲日韩乱码中文无码蜜桃| 狠狠综合久久av一区二| 久久这里只精品热免费99| 中国丰满少妇人妻xxx性董鑫洁| 麻豆一区二区三区香蕉视频| 精品无码久久久久久尤物| 天天澡日日澡狠狠欧美老妇| 日韩精品中文字幕第二页| 国产av无码专区亚洲aⅴ| 国产精品va无码一区二区| 欧美性色黄大片| 国产精品亚洲mnbav网站| 欧美日韩另类国产| 永久无码天堂网小说区| 人妻饥渴偷公乱中文字幕| 国产精品久久777777| 国产精品自在自线视频| 久久免费观看归女高潮特黄 | 国产在线精品无码二区| 国产成人亚洲日韩欧美| 中文字幕日本一区二区在线观看| 亚洲VA成无码人在线观看天堂| 人妻中文字幕精品一页| 久久se精品一区精品二区国产| 久久精品亚洲国产综合色| 国产不卡一区二区精品| 中文字幕精品人妻丝袜| 亚洲精品国产无套在线观| 97久久精品人人做人人爽| 一二三四中文字幕日韩乱码| 景泰县| 精品国产精品午夜福利| 亚洲精品一区国产精品| 免费看欧美全黄成人片| 国产激情一区二区三区在线| 精品国产污污免费网站| 国产精品白嫩极品在线看| 亚洲av无码精品蜜桃| 最新亚洲人成无码WWW|