2012-03-04 58 views
7

對於返回HTML的ASP.NET MVC請求和返回JSON的ASP.NET Web API,我可以擁有相同的url嗎?ASP.NET Web API可以在與MVC相同的URL上工作嗎?

我看到的例子路線是這樣的:"api/{id}"但我才能MVC(而不是web API)也擺脫這種api/部分使用這個地址嗎?

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

換句話說:我可以讓ControllerApiController具有相同的網址嗎?或者我也應該使用ApiController也用於HTML?

回答

5

正如前面的答案所述,你不能做這樣的事情,我真的不明白爲什麼你會想要做這樣的事情。

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

+0

確切地說,保持它們是單獨的項目 – RickAndMSFT 2012-03-30 16:36:03

+2

@ Rick.Anderson-at-Microsoft.com,我不是說你應該將它們放在單獨的項目中,這取決於api和站點的大小。如果它是一個小應用程序,我認爲你可以在同一個項目中同時擁有API和站點,並且只要有可能就把api放在一個區域中就可以分開它們。 – 2012-03-31 14:16:45

1

不,你不能有一個URL路由到兩個不同的類。如果多個路由匹配傳入的請求,則將使用第一個匹配的匹配。

我不知道爲什麼你需要在一個項目中混合使用兩者,至少沒有任何實際的原因。 ApiController可以返回HTML,並且MVC Controller可以返回JSON,因此只需選擇一個並使用它。

1

先前的答案已經解釋了這種情況。有一點需要補充的是,ASP.NET MVC或Web API,你的所有路由都是在同一個列表下收集的。

例如,在默認項目模板上,如果您在Web API之前註冊了ASP.NET MVC路徑,您將看到根據/api路徑的請求被ASP.NET MVC路徑拾取。

0

由於Web API使用與MVC相同的路由系統,因此如果您有某種方法可以區分路由,那麼您可以爲兩者使用相同的基本URL。您需要某種路由約束才能將api調用映射到api。例如,這可以是查詢字符串參數。

如果你的網址是完全一樣的,甚至下來查詢字符串,然後沒有。你運氣不好。

1

在理論上,你可以使用Web API和建設的內容提供商將返回HTML(可能從剃刀),當客戶端請求文\ html和JSON當客戶端請求應用程序\ JSON

3

我可能會打魔鬼在這裏提倡,但我可以看到爲什麼有人想要做這樣的事情。

在同一個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(我也嘗試過);)

+0

有趣的想法。你能寫一個完整的樣本併發布嗎? – RickAndMSFT 2012-03-30 16:39:01

+0

我在GitHub上放了一個完整的示例。 https://github.com/arble/WebApiContrib.MessageHandlers.Html – 2012-03-31 01:03:26

+0

@OliverPicton頁面找不到我?這仍然活躍嗎? – Qpirate 2013-03-27 14:16:20

相關問題