рд╡реЗрдмрдПрдкреАрдЖрдИ: рдСрдЯреЛ рдЬрдирд░реЗрдЯ рд░реАрд╕реНрдЯ рдПрдкреАрдЖрдИ рд╡реЗрдм рдбреЙрдХреНрдпреВрдореЗрдВрдЯреЗрд╢рди

рдЗрд╕ рдмреНрд▓реЙрдЧ рдкреЛрд╕реНрдЯ рдореЗрдВ, рд╣рдо ApiExplorer рдкрд░ рдПрдХ рдирдЬрд╝рджреАрдХреА рдирдЬрд╝рд░ рдбрд╛рд▓реЗрдВрдЧреЗ, рдЬреЛ рдХрд┐ IApiExplorer рдХрд╛ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реИ, рдФрд░ рджреЗрдЦреЗрдВ рдХрд┐ рдЖрдк рд╕реБрд▓рдн REST API рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╡реЗрдм рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдХреИрд╕реЗ рдЬрд▓реНрджреА рд╕реЗ рддреИрдпрд╛рд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдореЗрдВ рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░ рдХреА рдЬрд╛рдирдХрд╛рд░реА рд╣реЛрдЧреА, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдорд╛рдиреНрдп URL, рдорд╛рдиреНрдп HTTP рддрд░реАрдХреЗ рдФрд░ рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЗ рд▓рд┐рдП рдЕрдкреЗрдХреНрд╖рд┐рдд рдкреИрд░рд╛рдореАрдЯрд░ред рдЖрдкрдХреА REST рд╕реЗрд╡рд╛ рдХреЗ рд▓рд┐рдП рдЗрд╕ рддрд░рд╣ рдХреА рдЬрд╛рдирдХрд╛рд░реА рддреГрддреАрдп-рдкрдХреНрд╖ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЛ рдЖрдкрдХреЗ API рдХрд╛ рдЙрдкрднреЛрдЧ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧреА, рддрд╛рдХрд┐ рдпрд╣ рдЬрд╛рди рд╕рдХреЗ рдХрд┐ рдЗрд╕рдХреЗ рдкреБрд░реНрдЬрд╝реЛрдВ рдХреЛ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдХреИрд╕реЗ рдХреЙрд▓ рдХрд┐рдпрд╛ рдЬрд╛рдПред рд╕рдВрднрд╡рддрдГ рд╡реЗрдм рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реАрдХрд░рдг рдХреЗ рдЗрд╕ рдкреГрд╖реНрда рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫреА рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рдЖрдкрдХреЗ REST API рдХреЗ рдЕрджреНрдпрддрди рдХреЗ рд╕рд╛рде рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдЕрдкрдбреЗрдЯ рд╣реЛ рдЬрд╛рдПрдЧрд╛ред

ApiExplorer


рдЗрд╕ рд╡рд░реНрдЧ рдХрд╛ рдореБрдЦреНрдп рдЙрджреНрджреЗрд╢реНрдп ApiDescription рддрддреНрд╡реЛрдВ рдХрд╛ рдПрдХ рд╕рдВрдЧреНрд░рд╣ рдЙрддреНрдкрдиреНрди рдХрд░рдирд╛ рд╣реИред рдпрд╣ рд╕реНрдереИрддрд┐рдХ рдорд╛рд░реНрдЧ рдХреА рдЬрд╛рдБрдЪ рдФрд░ рдЖрдкрдХреЗ рдирд┐рдпрдВрддреНрд░рдХреЛрдВ рдХреЗ рдЕрдВрджрд░ рдЙрдкрд▓рдмреНрдз рдХреНрд░рд┐рдпрд╛рдУрдВ рджреНрд╡рд╛рд░рд╛ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдкреНрд░рддреНрдпреЗрдХ ApiDescription рддрддреНрд╡ рдЖрдкрдХреА рд╕реЗрд╡рд╛ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЙрдкрд▓рдмреНрдз API рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддрд╛ рд╣реИред рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рд╕рд░рд▓реАрдХреГрдд рдЖрд░реЗрдЦ (рдЪрд┐рддреНрд░ 1) рдореЗрдВ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдЕрдкреАрд╕реНрдХреНрд░рд┐рдкреНрд╢рди рдореЗрдВ рдмреБрдирд┐рдпрд╛рджреА рдЬрд╛рдирдХрд╛рд░реА рдЬреИрд╕реЗ рдХрд┐ HttpMethod, RelativePath, рдкреНрд░рд▓реЗрдЦрди, рдЖрджрд┐ рд╢рд╛рдорд┐рд▓ рд╣реИрдВред рд▓реЗрдХрд┐рди рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЗрд╕рдореЗрдВ ApiDescriptor рддрддреНрд╡ рд╢рд╛рдорд┐рд▓ рд╣реИ, рдЬреЛ WebAPI рдХреЛрд░ рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╣реИ рдЬреЛ рд╕рдВрдмрдВрдзрд┐рдд рдХрд╛рд░реНрд░рд╡рд╛рдИ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕рдм рдХреБрдЫ рдЬрд╛рдирддрд╛ рд╣реИред рдЖрдк рдЗрд╕ рддрддреНрд╡ рдХрд╛ рдЙрдкрдпреЛрдЧ рд╡реНрдпрд╛рдкрдХ рдЬрд╛рдирдХрд╛рд░реА рдЬреИрд╕реЗ рдХрд┐ рдПрдХреНрд╢рди рдирд╛рдо, рд░рд┐рдЯрд░реНрди рдкреНрд░рдХрд╛рд░, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдЖрджрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕реА рддрд░рд╣, рдЖрдк рдЗрд╕ API рдХреЗ рдЕрдкреЗрдХреНрд╖рд┐рдд рдорд╛рдкрджрдВрдбреЛрдВ рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП ParameterDescriptor рддрддреНрд╡ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

clip_image001
рдЪрд┐рддреНрд░ 1ред ApiDescription рд╡рд░реНрдЧ рдЖрд░реЗрдЦ

рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рд╣рдо рдПрдХ рд╕рд╣рд╛рдпрддрд╛ рдкреГрд╖реНрда рдХреИрд╕реЗ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВред

рдПрдкреАрдЖрдИ рд╕рд╣рд╛рдпрддрд╛ рдкреЗрдЬ рдЬрдирд░реЗрд╢рди


рд╕рд╛рджрдЧреА рдХреЗ рд▓рд┐рдП, рдореИрдВ рдорд╛рди рд▓реВрдВрдЧрд╛ рдХрд┐ рд╣рдо ASP.NET MVC рдХреЗ рд╕рд╛рде рдЕрдкрдиреА REST рд╕реЗрд╡рд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рдЖрдк рдЕрдиреНрдп рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЕрдиреБрднрд╛рдЧреЛрдВ рдореЗрдВ рдЕрдиреНрдп рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╡рд┐рдЪрд╛рд░реЛрдВ рдХреЛ рдиреАрдЪреЗ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВред

рдЙрджрд╛рд╣рд░рдг


рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдореИрдВ рдорд╛рдирдХ "рд╡реЗрдм рдПрдкреАрдЖрдИ" рдЯреЗрдореНрдкрд▓реЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВред

clip_image002
рдЕрдВрдЬреАрд░ред реиред рд╡реЗрдм рдПрдкреАрдЖрдИ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдЪрдпрди

рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ, рдЗрд╕ рдЯреЗрдореНрдкрд▓реЗрдЯ рдореЗрдВ HomeController MVC рдирд┐рдпрдВрддреНрд░рдХ рдФрд░ ValuesController рд╡реЗрдм рдПрдкреАрдЖрдИ рд╢рд╛рдорд┐рд▓ рд╣реИрдВред рдЖрдЗрдП рд╣рдорд╛рд░реЗ рд╕рд╣рд╛рдпрддрд╛ рдкреГрд╖реНрда рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реЛрдордХрдВрдЯреНрд░реЛрд▓рд░ рдореЗрдВ рд╕реВрдЪрдХрд╛рдВрдХ рдХреНрд░рд┐рдпрд╛ рдХреЛ рдмрджрд▓реЗрдВред

рдЪрд░рдг 1ред рджреЗрдЦреЗрдВ рдореЗрдВ ApiExplorer рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛


рдЕрдиреБрдХреНрд░рдордгрд┐рдХрд╛ рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рдХреЛрдб рдХреА рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рджреЛ рдкрдВрдХреНрддрд┐рдпрд╛рдБ рдЬреЛрдбрд╝реЗрдВ:

public ActionResult Index() { var apiExplorer = GlobalConfiguration.Configuration.Services.GetApiExplorer(); return View(apiExplorer); } 

рдЪрд░рдг 2. рдПрдкреАрдЖрдИ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рджреГрд╢реНрдп рд╕реЗрдЯ рдХрд░реЗрдВ


Index.cshtml рдореЗрдВ рд╣рдо IApiExplorer рдореЙрдбрд▓ рдкреНрд░рдХрд╛рд░ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

@model System.Web.Http.Description.IApiExplorer

рдлрд┐рд░ рд╣рдо рд╕рдорд░реНрдерд┐рдд HTTP рд╡рд┐рдзрд┐рдпреЛрдВ, рд╕рд╛рдкреЗрдХреНрд╖ URL, рдХреНрд░рд┐рдпрд╛рдУрдВ рдХрд╛ рд╡рд┐рд╡рд░рдг рдФрд░ рдЕрдкреЗрдХреНрд╖рд┐рдд рдкреИрд░рд╛рдореАрдЯрд░ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП Model.ApiDeslass рдХреЗ рд╕рднреА рддрддреНрд╡реЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВред

 @foreach (var api in Model.ApiDescriptions) { <li> <h5>@api.HttpMethod @api.RelativePath</h5> <blockquote> <p>@api.Documentation</p> @if (api.ParameterDescriptions.Count > 0) { <h6>Parameters</h6> <ul> @foreach (var parameter in api.ParameterDescriptions) { <li>@parameter.Name: @parameter.Documentation (@parameter.Source)</li> } </ul> } </blockquote> </li> } 

рдмреЗрд╢рдХ рдЖрдк рдЕрдкрдиреЗ HTML рдорд╛рд░реНрдХрдЕрдк рдХреЛ рдЕрдкрдиреА рдЗрдЪреНрдЫрд╛рдиреБрд╕рд╛рд░ рдХрд╕реНрдЯрдорд╛рдЗрдЬрд╝ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдкреНрд░рд╕реНрддреБрддрд┐ рдХреЗ рд▓рд┐рдП рдиреАрдЪреЗ рдкреВрд░рд╛ рдХреЛрдб рд╣реИ:

 @model System.Web.Http.Description.IApiExplorer <div id="body"> <section class="featured"> <div class="content-wrapper"> <hgroup class="title"> <h1>ASP.NET Web API Help Page</h1> </hgroup> </div> </section> <section class="content-wrapper main-content clear-fix"> <h3>APIs</h3> <ul> @foreach (var api in Model.ApiDescriptions) { <li> <h5>@api.HttpMethod @api.RelativePath</h5> <blockquote> <p>@api.Documentation</p> @if (api.ParameterDescriptions.Count > 0) { <h6>Parameters</h6> <ul> @foreach (var parameter in api.ParameterDescriptions) { <li>@parameter.Name: @parameter.Documentation (@parameter.Source)</li> } </ul> } </blockquote> </li> } </ul> </section> </div> 

рдЕрдм, рдЖрд╡реЗрджрди рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдЖрдкрдХреЛ рдЙрдкрд▓рдмреНрдз REST API (рдЪрд┐рддреНрд░ 3) рдХреЗ рд╡рд┐рд╡рд░рдг рдХреЗ рд╕рд╛рде рдЕрдЧрд▓рд╛ рдкреГрд╖реНрда рджреЗрдЦрдирд╛ рдЪрд╛рд╣рд┐рдПред

clip_image003
рдЪрд┐рддреНрд░ 3ред рд╡реЗрдм рдбреЙрдХреНрдпреВрдореЗрдВрдЯреЗрд╢рди рдкреЗрдЬ

рдпрджрд┐ рдЖрдк рдПрдХ рдХрд░реАрдм рд╕реЗ рджреЗрдЦрддреЗ рд╣реИрдВ, рддреЛ рдПрдкреАрдЖрдИ рд╡рд┐рд╡рд░рдг рдХреЗрд╡рд▓ "XYZ рдХреЗ рд▓рд┐рдП рдкреНрд░рд▓реЗрдЦрди" рдХрд╣рддрд╛ рд╣реИ, рдЬреЛ рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд░реВрдк рд╕реЗ рдмрд╣реБрдд рдЙрдкрдпреЛрдЧреА рдирд╣реАрдВ рд╣реИред рдЖрдЗрдП рдХреБрдЫ рдЙрдкрдпреЛрдЧреА рдЬрд╛рдирдХрд╛рд░реА рдЬреЛрдбрд╝реЗрдВред

рдЪрд░рдг 3. рдкреНрд░рд▓реЗрдЦрди рдЬреЛрдбрд╝рдирд╛


рдПрдкреАрдЖрдИ рдХреЗ рд▓рд┐рдП рджрд╕реНрддрд╛рд╡реЗрдЬ рддреИрдпрд╛рд░ рдХрд░рддреЗ рд╕рдордп, рд╣рдорд╛рд░рд╛ ApiExplorer рдЖрд╡рд╢реНрдпрдХ рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ IDocumentationProvider рдХрд╛ рдЕрдиреБрд░реЛрдз рдХрд░рддрд╛ рд╣реИред IDocumentationProvider рдПрдХ рдЕрдореВрд░реНрдд рддрдВрддреНрд░ рд╣реИ рдЬреЛ рдЖрдкрдХреЛ API рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЗ рджрд╕реНрддрд╛рд╡реЗрдЬреАрдХрд░рдг рдХреЗ рд▓рд┐рдП рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдкрдиреЗ рддрд░реАрдХреЗ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдпрд╣ рдЖрдкрдХреЛ рдЕрдкрдиреЗ рдЦреБрдж рдХреЗ IDocumentationProvider рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдЬреЛ рдЖрдкрдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╕реНрд░реЛрдд рд╕реЗ рдЬрд╛рдирдХрд╛рд░реА рдирд┐рдХрд╛рд▓ рджреЗрдЧрд╛ред рдиреАрдЪреЗ рдЖрдк IDocumentationProvider рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ C # рджрд╕реНрддрд╛рд╡реЗрдЬреА рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рд╕реЗ рдЬрд╛рдирдХрд╛рд░реА рдирд┐рдХрд╛рд▓рддрд╛ рд╣реИред

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

рдЙрд╕рдХреЗ рдмрд╛рдж, рдЖрдкрдХреЛ рдЕрдкрдирд╛ рдЦреБрдж рдХрд╛ IDocumentationProvider рдХрдиреЗрдХреНрдЯ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдРрд╕рд╛ рдХрд░рдиреЗ рдХрд╛ рд╕рдмрд╕реЗ рдЖрд╕рд╛рди рддрд░реАрдХрд╛ HttpConfiguration рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╣реИред рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ XmlCommentDocumentationProvider рдХреЛ рдпрд╣ рдЬрд╛рдирдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде XML рдлрд╝рд╛рдЗрд▓ рдХрд╣рд╛рдБ рд╕реНрдерд┐рдд рд╣реИред

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

рдЖрдк рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдЖрдкрдХреА XML рдкреНрд░рд▓реЗрдЦрди рдлрд╝рд╛рдЗрд▓ рдХреА рдкреАрдврд╝реА рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ (рдЪрд┐рддреНрд░ 4) рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реИред

clip_image004
рдЪрд┐рддреНрд░ 4ред рдкреНрд░рд▓реЗрдЦрди рдлрд╝рд╛рдЗрд▓ рдкреАрдврд╝реА рд╡рд┐рдХрд▓реНрдк рдХреА рд╕реНрдерд╛рдкрдирд╛

рдЙрд╕рдХреЗ рдмрд╛рдж, рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ рдЖрдкрдХреЗ рдХреЛрдб рдореЗрдВ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ рд╣реИрдВ:

clip_image005

рдЕрдВрдд рдореЗрдВ, рдЕрдкрдиреА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЛ рдлрд┐рд░ рд╕реЗ рдЪрд▓рд╛рдПрдВ рдФрд░ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ рдЖрдкрдХреЗ рдХреЛрдб рд╕реЗ рдкреНрд░рд▓реЗрдЦрди рдЕрдм рдЖрдкрдХреЗ REST API (рдЪрд┐рддреНрд░ 5) рдХреЗ рд╡реЗрдм рдкреНрд░рд▓реЗрдЦрди рдкреГрд╖реНрда рдкрд░ рдЙрдкрд▓рдмреНрдз рд╣реИред

clip_image006
рдЪрд┐рддреНрд░ 5ред рд╡рд┐рдзрд┐ рдкреНрд░рд▓реЗрдЦрди рд╡реЗрдм рдкреЗрдЬ

рдкреНрд░рд▓реЗрдЦрди рд╕реЗ рдирд┐рдпрдВрддреНрд░рдХ / рдХрд╛рд░реНрд░рд╡рд╛рдИ рдЕрдкрд╡рд╛рдж


рдХрд┐рд╕реА рдХрд╛рд░рдг рд╕реЗ, рдПрдкреАрдЖрдИ рдкреНрд░рд▓реЗрдЦрди рдкреАрдврд╝реА рд╕реЗ рдирд┐рдпрдВрддреНрд░рдХ рдпрд╛ рдХрд╛рд░реНрд░рд╡рд╛рдИ рдХреЛ рдмрд╛рд╣рд░ рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк рд╡рд┐рд╢реЗрд╖ ApiExplorerSettingsAttribute рд╡рд┐рд╢реЗрд╖рддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

 public class ValuesController : ApiController { [ApiExplorerSettings(IgnoreApi = true)] public void MySpecialAction() { } } 

рдпрд╣ рдирд┐рдпрдВрддреНрд░рдХ рдХреЗ рд▓рд┐рдП рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:

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

рдЕрдиреНрдп рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди


рдореИрдВрдиреЗ рдКрдкрд░ рдЬреЛ рджрд┐рдЦрд╛рдпрд╛ рд╡рд╣ рд╡реЗрдм рдкреНрд░рд▓реЗрдЦрди рдкреГрд╖реНрда рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХрд╛ рд╕рд┐рд░реНрдл рдПрдХ рддрд░реАрдХрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдХрдИ рдЕрдиреНрдп рддрд░реАрдХреЗ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, рдпрд╣рд╛рдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рдФрд░ рд╡рд┐рдЪрд╛рд░:

рдЕрдиреБрд╡рд╛рджрдХ рдХрд╛ рдиреЛрдЯ


рд▓реЗрдЦ рднрд╡рд┐рд╖реНрдп рдХреА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддрд╛ рд╣реИ рдЬреЛ ASP.NET WebAPI рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛рдПрдЧрд╛ред рдЖрдк WebAPI рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА aspnetwebstack.codeplex.com/.../353867 рд╕реЗ рдЖрд╡рд╢реНрдпрдХ рдкреИрдХреЗрдЬ рдЗрдВрд╕реНрдЯреЙрд▓ рдХрд░рдХреЗ рдЗрд╕реЗ рдЖрдЬрдорд╛ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдПрдХ рдЕрд▓рдЧ рд▓реЗрдЦ рдореЗрдВ рдХреИрд╕реЗ рд▓рд┐рдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

Source: https://habr.com/ru/post/In144915/


All Articles