2012-08-02 50 views
8

我正在使用ASP.NET MVC 4 Web API創建一個RESTful Web服務。對於API訪問,我返回JSON,但是一旦我使一切正常工作,默認情況下,內容協商應該適用於XML和JSON。ASP.NET MVC 4/Web API - 爲接受插入剃鬚刀渲染器:text/html

由於我正致力於一個真正的RESTful資源爲中心的Web服務,我的URI將指向實際的資源。如果Accepts: text/html出現在請求中(比如在瀏覽器中拋出鏈接),我希望通過返回資源的HTML表示來利用該優勢。

我希望能夠利用MVC 4 Web API的內容協商來插入使用Razor模板的text/html的渲染器。有沒有任何工作的例子來做到這一點?

是的,這是橋接「常規」MVC頁面和Web API。基本上我想創建一個渲染器,使用基於約定的方法來查找和渲染Razor視圖,就像「常規」MVC一樣。我可以想出基於約定的查看邏輯。 我使用手動剃鬚刀引擎渲染我的模型轉換成HTML只是尋找一)全球插入我的text/html渲染到內容negotation和B)

+0

重定向到Html的正常控制器是否可以接受(或通過HttpRequest執行另一個操作並將結果發送回客戶端)? – 2012-08-02 18:04:05

+0

@KyleTrauberman,我寧願進入內容談判。至少從我有限的理解來看,這在架構上將是最明智的未來。我在猜測Web API,而且將來會有一些常規的MVC,我將把注意力放在Web API基礎設施上,因此構建內容協商框架似乎是正確的方式。重定向到不同的控制器可能會工作,但我的經驗使我相信這將是不自然的,並在未來造成麻煩。但我不反對理解如何工作:) – MikeJansen 2012-08-02 18:37:45

回答

3

弗雷德裏克·諾門對這個題目博客文章:

http://weblogs.asp.net/fredriknormen/archive/2012/06/28/using-razor-together-with-asp-net-web-api.aspx

基本上,你需要在Global.asax中創建一個MediaTypeFormatter

using System; 
using System.Net.Http.Formatting; 

namespace WebApiRazor.Models 
{ 
    using System.IO; 
    using System.Net; 
    using System.Net.Http.Headers; 
    using System.Reflection; 
    using System.Threading.Tasks; 

    using RazorEngine; 

    public class RazorFormatter : MediaTypeFormatter 
    { 
     public RazorFormatter() 
     { 
      SupportedMediaTypes.Add(new MediaTypeHeaderValue("text/html")); 
      SupportedMediaTypes.Add(new MediaTypeHeaderValue("application/xhtml+xml")); 
     } 

     //... 

     public override Task WriteToStreamAsync(
               Type type, 
               object value, 
               Stream stream, 
               HttpContentHeaders contentHeaders, 
               TransportContext transportContext) 
     { 
      var task = Task.Factory.StartNew(() => 
       { 
        var viewPath = // Get path to the view by the name of the type 

        var template = File.ReadAllText(viewPath); 

        Razor.Compile(template, type, type.Name); 
        var razor = Razor.Run(type.Name, value); 

        var buf = System.Text.Encoding.Default.GetBytes(razor); 

        stream.Write(buf, 0, buf.Length); 

        stream.Flush(); 
       }); 

      return task; 
     } 
    } 
} 

,然後註冊它:

GlobalConfiguration.Configuration.Formatters.Add(new RazorFormatter()); 

上面的代碼是從博客文章中複製而來,並不是我的工作

+0

完美,謝謝!比我預想的要簡單得多。 – MikeJansen 2012-08-03 12:36:49

0

您可以查看WebApiContrib.Formatting.Razor。這與凱爾的答案非常相似,不過它是一個擁有更多功能和單元測試等的完整開源項目。您也可以使用get it on NuGet

我會說它絕對需要更多的功能,但它們似乎設計得很好,所以它很容易做出貢獻。