2012-03-04 2 views
7

Posso avere lo stesso URL per entrambe le richieste ASP.NET MVC che restituiscono HTML e API Web ASP.NET restituiscono JSON?L'API Web ASP.NET può funzionare sullo stesso URL di MVC?

vedo in esempi percorsi come questo: "api/{id}" ma posso liberarmi di questo api/ parte e L'indirizzo in MVC (non Web API) troppo?

Da un lato questo dovrebbe essere possibile poiché abbiamo la negoziazione del contenuto. Ma in questo modo ho bisogno di due percorsi con lo stesso indirizzo, quindi questo non ha senso, giusto?

In altre parole: posso avere Controller e ApiController con lo stesso URL? O dovrei usare ApiController anche per HTML?

risposta

5

Come affermato nella risposta precedente, non è possibile fare una cosa del genere e non riesco davvero a capire il motivo per cui si vorrebbe fare qualcosa del genere.

Ma non sono d'accordo sul fatto che dovresti attenersi a una cosa in un singolo progetto, se vuoi un'API pulita, allora andrei per il webapi e userò MVC per ospitare le mie pagine, ea quel punto avrei il API in una cartella separata più sotto una rotta separata.

+0

esattamente, tenerli è progetti separati – RickAndMSFT

+2

@ Rick.Anderson-at-Microsoft.com, non dico che si dovrebbe tenerli in progetti separati, che dipende dalla dimensione della API e del sito. Se si tratta di una piccola applicazione, penso che sia possibile avere sia l'API che il sito nello stesso progetto e semplicemente separarli avendo l'API in un'area se è possibile. –

1

No, non è possibile avere un'unica route URL per due classi diverse. Se più di una rotta corrisponde a una richiesta in arrivo, verrà utilizzata la prima a cui abbinare.

Non sono sicuro del motivo per cui è necessario combinare i due in un singolo progetto, almeno non per ragioni pratiche. ApiController può restituire HTML e MVC può restituire JSON, quindi scegline uno e usalo.

1

Le risposte precedenti hanno spiegato la situazione. Una cosa da aggiungere è che, ASP.NET MVC o Web API, tutte le rotte vengono raccolte sotto lo stesso elenco.

Ad esempio, nel modello di progetto predefinito, se si registra il percorso MVC ASP.NET prima di quello Web API, si noterà che le richieste con il percorso /api vengono rilevate dalla route MVC ASP.NET.

0

Poiché l'API Web utilizza lo stesso sistema di routing di MVC, se si dispone di un modo per differenziare i percorsi, è possibile utilizzare lo stesso URL di base per entrambi. Avresti bisogno di una sorta di vincolo del percorso per mappare le chiamate API all'api. Questo potrebbe essere il parametro di querystring, per esempio.

Se il tuo url è esattamente lo stesso, anche a querystring, quindi no. Sei fuori di fortuna.

1

In teoria, è possibile utilizzare API Web e costruire un fornitore di contenuti che restituirà l'HTML (possibile da rasoio) quando il client richiede di testo \ html e JSON quando il client richiede applicazione \ JSON

3

mi può giocare diavolo difensore qui, ma posso vedere il punto perché qualcuno vorrebbe fare qualcosa di simile.

Spesso è bello avere una rappresentazione HTML di un'API sullo stesso URL. Questo approccio consente agli utenti di fare clic intorno ed esplorare un'API all'interno del browser.

Ho ottenuto questo problema in WebAPI utilizzando un gestore di messaggi personalizzato che reindirizza 302 a una route 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); 
     } 
    } 
} 

po 'di hack forse, ma fa il lavoro e io personalmente piace più di un costume HTML MediaTypeFormatter (che ho anche provato);)

+0

Idea interessante. Puoi scrivere un campione completo e postarlo? – RickAndMSFT

+0

Ho messo un esempio completo su GitHub. https://github.com/arble/WebApiContrib.MessageHandlers.Html –

+0

@OliverPicton pagina non trovata per me? è ancora attivo? – Qpirate

2

WebAPI consente di definire i vincoli di percorso personalizzato mediante l'attuazione di System.Web.Http.Routing.IHttpRouteConstraint.

In normale ASP.NET MVC è possibile fare lo stesso implementando System.Web.Routing.IRouteConstraint.

In questo modo, è possibile creare percorsi attivi solo per una determinata intestazione HTTP Accept, ad es. "application/json" o "text/html".

+0

l'unica risposta - proprio sul posto – Bond