Dot-Net

ASP.NET Web API 可以在與 MVC 相同的 url 上工作嗎?

  • March 27, 2013

對於返回 HTML 的 ASP.NET MVC 請求和返回 JSON 的 ASP.NET Web API,我可以使用相同的 url 嗎?

我在這樣的範例路由中看到:"api/{id}"但是我可以擺脫這api/部分在 MVC(不是 Web API)中使用這個地址嗎?

一方面,這應該是可能的,因為我們有內容協商。但是這樣我需要兩條具有相同地址的路由,所以這沒有意義,對吧?

換句話說:我可以擁有相同ControllerApiController網址嗎?還是我ApiController也應該使用 HTML?

如上一個答案所述,您不能做這樣的事情,我真的不明白您為什麼要這樣做。

但我不同意你應該在一個項目中堅持一件事,如果你想要一個乾淨的 API,那麼我會選擇 webapi 並使用 MVC 來託管我的頁面,那時我會將 API 放在一個單獨的文件夾加上單獨的路線。

我可能在這裡扮演魔鬼代言人,但我可以理解為什麼有人會想要做這樣的事情。

通常在同一個 URL 上有一個 API 的 HTML 表示是很好的。這種方法允許使用者在瀏覽器中點擊並探索 API。

我通過使用自定義消息處理程序在 WebAPI 中解決了這個問題,該處理程序 302 重定向到 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);
       }
   }
}

可能有點破解,但它確實可以完成工作,我個人更喜歡它而不是自定義 HTML MediaTypeFormatter(我也嘗試過);)

引用自:https://stackoverflow.com/questions/9558039