2012-06-11 139 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

非常感谢卢克,你的评论真的让我的一天:) –