with tutorial started route net asp c# asp.net asp.net-mvc asp.net-web-api asp.net-mvc-apiexplorer

c# - tutorial - ASP.Net Web Api-ApiExplorer no contiene ninguna ApiDescriptions



web api json c# (3)

Debería buscar actualizar a la RTM de WebApi que se lanzó ayer y luego revisar la recientemente lanzada Página de Ayuda de ASP.NET WebApi (Vista previa) que también fue lanzada ayer.

Este paquete genera automáticamente el contenido de la página de ayuda para las API web en su sitio. Los visitantes de su página de ayuda pueden usar este contenido para aprender cómo llamar a sus API web. Todo lo generado por la página de ayuda es totalmente personalizable usando ASP.NET MVC y Razor.

Está implementando el ApiExplorer debajo de las cubiertas.

Estoy intentando implementar un método de Opciones en un controlador de mi servicio web que devolverá un mensaje que contiene los métodos HTTP válidos para el punto final URI asociado con el controlador. Mi método de Opciones tiene el siguiente aspecto:

public HttpResponseMessage Options() { var resp = new HttpResponseMessage(); resp.Content = new StringContent(""); var apiExplorer = GlobalConfiguration.Configuration.Services .GetApiExplorer(); foreach (ApiDescription api in apiExplorer.ApiDescriptions) { resp.Content.Headers.Add("Allow", api.HttpMethod.Method); } return resp; }

He probado el método anterior en un nuevo proyecto Web Api (implicación: enrutamiento inalterado) dentro de un controlador con métodos Get, Post y Delete. Como se esperaba, se devuelve una respuesta con "Permitir: OBTENER, PUBLICAR, ELIMINAR". Estoy teniendo problemas, sin embargo, agregando esto a un proyecto más grande en el que estoy trabajando. En el proyecto más grande, la lista ApiDescriptions dentro de ApiExplorer no contiene ningún elemento. ¿Por qué es esto? Sospecho que se debe al enrutamiento personalizado que se ha implementado, aunque la única base para esa sospecha es el siguiente enlace:

http://forums.asp.net/t/1821651.aspx/1

¿Alguien más ha experimentado esta lista vacía de ApiDescription? Si es así, ¿encontró un remedio?

Nota: Estoy usando MCV 4 RC


La solución para este problema es comentar en ProjectName / Areas / HelpPage / Controllers / HelpController.cs los constructores como este:

public class HelpController : Controller { private const string ErrorViewName = "Error"; // public HelpController() // : this(GlobalConfiguration.Configuration) // { // } // public HelpController(HttpConfiguration config) // { // Configuration = config; // } /// <summary> /// GlobalConfiguration By default /// </summary> protected static HttpConfiguration Configuration { get { return GlobalConfiguration.Configuration; } } public ActionResult Index() { ViewBag.DocumentationProvider = Configuration.Services.GetDocumentationProvider(); return View(Configuration.Services.GetApiExplorer().ApiDescriptions); } ....

El constructor predeterminado no es llamado;

El segundo método es inyectar el constructor predeterminado agregando este atributo [InjectionConstructor] en un constructor predeterminado como este:

public class HelpController : Controller { private const string ErrorViewName = "Error"; [InjectionConstructor] public HelpController() : this(GlobalConfiguration.Configuration) { } public HelpController(HttpConfiguration config) { Configuration = config; } /// <summary> /// GlobalConfiguration By default /// </summary> protected static HttpConfiguration Configuration { get; private set; } ....


Si usa Glimpse, es posible que deba deshabilitar su inspector de ruta:

<glimpse defaultRuntimePolicy="On" endpointBaseUri="~/Glimpse.axd"> <logging level="Off" /> <tabs> <ignoredTypes> <add type="Glimpse.AspNet.Tab.Routes, Glimpse.AspNet" /> </ignoredTypes> </tabs> <inspectors> <ignoredTypes> <add type="Glimpse.AspNet.Inspector.RoutesInspector, Glimpse.AspNet" /> </ignoredTypes> </inspectors> </glimpse>

Glimpse crea RouteProxies que rompe la enumeración en HostedHttpRouteCollection: https://github.com/mono/aspnetwebstack/blob/master/src/System.Web.Http.WebHost/Routing/HostedHttpRouteCollection.cs

Sé que el enlace es para mono, pero lo mismo es cierto para .Net estándar.