2012-03-04 17 views
7

¿Puedo tener la misma url para las solicitudes ASP.NET MVC que devuelven HTML y para ASP.NET Web API que devuelve JSON?¿Puede la API web de ASP.NET funcionar en la misma URL que MVC?

que ver en los ejemplos rutas como esta: "api/{id}" pero puedo deshacerme de este api/ parte y La dirección de MVC (no Web API) también?

Por un lado esto debería ser posible ya que tenemos negociación de contenido. Pero de esta manera necesito dos rutas con la misma dirección, así que esto no tiene sentido, ¿verdad?

En otras palabras: ¿puedo tener Controller y ApiController con la misma URL? ¿O debería usar ApiController también para HTML?

Respuesta

5

Como dije en la respuesta anterior no puedes hacer tal cosa y realmente no puedo entender por qué querrías hacer algo así.

Pero no estoy de acuerdo en que deba quedarse con una cosa en un solo proyecto, si quiere una API limpia, entonces iría por la webapi y usaría MVC para alojar mis páginas, y en ese punto tendría la API en una carpeta separada más en una ruta separada.

+0

exactamente, guárdelos en proyectos separados – RickAndMSFT

+2

@ Rick.Anderson-at-Microsoft.com, no digo que deba mantenerlos en proyectos separados, eso depende del tamaño de la API y del sitio. Si se trata de una aplicación pequeña, creo que puede tener la API y el sitio en el mismo proyecto y simplemente separarlos teniendo la API en un área si es posible. –

1

No, no puede tener una sola ruta de URL a dos clases diferentes. Si hay más de una ruta que coincida con una solicitud entrante, se usará la primera que coincida.

No estoy seguro de por qué tendría que mezclar los dos en un solo proyecto, al menos no por ningún motivo práctico. El ApiController puede devolver HTML y el MVC Controller puede devolver JSON, así que simplemente elija uno y úselo.

1

Las respuestas anteriores han explicado la situación. Una cosa para agregar es que, ASP.NET MVC o API Web, todas sus rutas se recopilan bajo la misma lista.

Por ejemplo, en la plantilla de proyecto predeterminada, si registra la ruta ASP.NET MVC antes de la API web, verá que las solicitudes en la ruta /api se recogen mediante la ruta ASP.NET MVC.

0

Dado que la API web utiliza el mismo sistema de enrutamiento que MVC, si tiene alguna forma de diferenciar las rutas, puede utilizar la misma url base para ambas. Necesitarás algún tipo de restricción de ruta para mapear llamadas de API a la API. Este podría ser un parámetro de cadena de consulta, por ejemplo.

Si su URL es exactamente la misma, incluso hasta la cadena de consulta, entonces no. No tienes suerte.

1

En teoría, puede utilizar la API web y construir un proveedor de contenido que devolverá html (posible a partir de la maquinilla de afeitar) cuando el cliente solicita el texto \ html y JSON cuando el cliente solicita la aplicación \ JSON

3

que pueden estar jugando los diablos defienden aquí, pero puedo ver el punto por el cual alguien querría hacer algo como esto.

A menudo es bueno tener una representación HTML de una API en la misma URL. Este enfoque permite a los usuarios hacer clic y explorar una API desde el navegador.

He conseguido esto en la WebAPI utilizando un controlador de mensajes personalizado que 302 redirige a una ruta MVC.

public class HtmlMessageHandler : DelegatingHandler 
{ 
    private List<string> contentTypes = new List<string> { "text/html", "application/html", "application/xhtml+xml" }; 

    protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) 
    { 
     if (request.Method == HttpMethod.Get && request.Headers.Accept.Any(h => contentTypes.Contains(h.ToString()))) 
     { 
      HttpResponseMessage response = new HttpResponseMessage(HttpStatusCode.Redirect); 

      var htmlUri = new Uri(String.Format("{0}/html",request.RequestUri.AbsoluteUri)); 

      response.Headers.Location = htmlUri; 

      return Task.Factory.StartNew<HttpResponseMessage>(()=> response); 
     } 
     else 
     { 
      return base.SendAsync(request, cancellationToken); 
     } 
    } 
} 

poco de un truco quizá pero tiene el trabajo y personalmente me gusta más que una costumbre HTML MediaTypeFormatter (que también he intentado);)

+0

Interesante idea. ¿Puedes escribir una muestra completa y publicarla? – RickAndMSFT

+0

He puesto una muestra completa en GitHub. https://github.com/arble/WebApiContrib.MessageHandlers.Html –

+0

@OliverPicton página no encontrada para mí? ¿esto todavía está activo? – Qpirate

2

WebAPI le permite definir restricciones de ruta personalizada mediante la implementación System.Web.Http.Routing.IHttpRouteConstraint.

En ASP.NET MVC regular puede hacer lo mismo implementando System.Web.Routing.IRouteConstraint.

De esta manera, puede crear rutas que solo están activas para un cierto encabezado HTTP Accept, p. "application/json" o "text/html".

+0

la única respuesta, justo allí mismo – Bond

Cuestiones relacionadas