2012-06-11 138 views
1

我正在編寫HTML的媒體類型格式化程序,以根據用戶的html請求自動生成Razor視圖。我正在做這個在SelfHosted服務中使用。我需要檢測請求的控制器/操作,以允許我選擇要呈現的視圖。ASP.Net WebAPI從MediaTypeFormatter中獲取當前的控制器名稱

public class RazorHtmlMediaTypeFormatter : MediaTypeFormatter 
    { 
     public RazorHtmlMediaTypeFormatter() 
     { 
      SupportedMediaTypes.Add(new MediaTypeHeaderValue("text/html")); 
     } 

     public override bool CanWriteType(Type type) 
     { 
      return true; 
     } 

     public override bool CanReadType(Type type) 
     { 
      return false; 
     } 

     public override Task WriteToStreamAsync(Type type, object value, Stream stream, HttpContentHeaders contentHeaders, System.Net.TransportContext transportContext) 
     { 
      return Task.Factory.StartNew(() => 
       { 
        var view = Razor.Resolve(String.Format("{0}.{1}.cshtml", something.Controller, something.Action), value); 

        byte[] buf = System.Text.Encoding.Default.GetBytes(view.Run(new ExecuteContext())); 
        stream.Write(buf, 0, buf.Length); 
        stream.Flush(); 
       }); 
     } 
    } 
+0

你沒有一個好的方法去HttpContext。也許你可以用global.asax做些什麼? – Joe

+0

@JoeTuskan喜歡在開始請求時設置一些靜態? IE基本上建立了我自己的httpcontext –

回答

1

Web API Contrib在here中有一個可用的RazorViewFormatter。

+1

它很高興知道某人已經做出了這一點,但作爲與filips接近它沒有很好地處理內容談判。當您返回一個非poco類時,您需要編寫一個自定義格式器以允許客戶端協商XML或HTML –

5

爲什麼不用你的退回對象包裝Metadata<T>

I.e.返回,而不是MyCustomObjectMetadata<MyCustomObject>。作爲元數據屬性,您可以設置控制器名稱和操作。然後在格式化程序中,將元數據和自定義對象分開,然後序列化該自定義對象。

我在這裏博客了這個方法 - http://www.strathweb.com/2012/06/extending-your-asp-net-web-api-responses-with-useful-metadata/。雖然這篇文章的目的有點不同,但我相信你可以將它與你的需求聯繫起來。

編輯:或者,如果你是一個小黑客OK,使用自定義過濾器和標題:

public override void OnActionExecuting(HttpActionContext actionContext) 
    { 
     actionContext.Response.Headers.Add("controller", actionContext.ActionDescriptor.ControllerDescriptor.ControllerName); 
     actionContext.Response.Headers.Add("action", actionContext.ActionDescriptor.ActionName;); 
     base.OnActionExecuting(actionContext); 
    } 

然後就從格式化的標題讀它,並刪除標題條目,以便它們不會發送到客戶端。

+1

我想過這種方法,但缺點是它在內容協商方面效果不好。您需要針對要發佈的每種類型的內容實施格式化程序,而不是依賴默認提供程序。順便說一下,我真的很喜歡你的博客,你有噸真正好東西在那裏:) –

+0

非常感謝盧克,你的評論真的讓我的一天:) –