C# 返回HTML的内容协商
在阅读了如何使用C# 返回HTML的内容协商,c#,html,asp.net-web-api,content-negotiation,C#,Html,Asp.net Web Api,Content Negotiation,在阅读了如何使用IHttpActionResult从webapi2返回HTML之后,我想基于随请求发送的Accept头,以某种方式将IHttpActionResult连接到我的ApiController 给定控制器动作的签名与此类似: public MyObject Get(int id) { return new MyObject(); } 如果请求指定了Accept:text/html,则应使用此IHttpActionResult返回html。可能吗?此外,如果您能深入了解json
IHttpActionResult
从webapi2返回HTML之后,我想基于随请求发送的Accept
头,以某种方式将IHttpActionResult
连接到我的ApiController
给定控制器动作的签名与此类似:
public MyObject Get(int id)
{
return new MyObject();
}
如果请求指定了
Accept:text/html
,则应使用此IHttpActionResult
返回html。可能吗?此外,如果您能深入了解json或xml(具有内置支持)的内容协商管道的工作原理,我们将不胜感激。如果我们暂时不讨论IHttpActionResult
,Web API中的内容协商过程将通过格式化程序驱动。因此,您需要创建一个新的格式化程序来处理媒体类型text/html
Web API公开了用于内容协商的默认算法,称为DefaultContentNegotiator
,它是服务IContentNegotiator
的实现
现在,此协商算法可以通过Web API自动运行,如以下情况:
用法#1:
public MyObject Get(int id)
{
return new MyObject();
}
或
您可以自己手动运行协商,如下所示:
用法#2:
public HttpResponseMessage Get()
{
HttpResponseMessage response = new HttpResponseMessage();
IContentNegotiator defaultNegotiator = this.Configuration.Services.GetContentNegotiator();
ContentNegotiationResult negotationResult = defaultNegotiator.Negotiate(typeof(string), this.Request, this.Configuration.Formatters);
response.Content = new ObjectContent<string>("Hello", negotationResult.Formatter, negotationResult.MediaType);
return response;
}
public HttpResponseMessage Get()
{
HttpResponseMessage response=新的HttpResponseMessage();
IContentNegotiator DefaultCongregator=this.Configuration.Services.GetContentCongregator();
ContentNegotiationResult NegotiationResult=DefaultCongregator.Congregate(typeof(string)、this.Request、this.Configuration.Formatters);
response.Content=newObjectContent(“Hello”,negotationResult.Formatter,negotationResult.MediaType);
返回响应;
}
关于IHttpActionResults:在以下场景中,
Ok
是生成类型的实例的快捷方法
OkNegotiatedContentResult
public IHttpActionResult Get()
{
返回Ok(“你好”);
}
问题是,这个OkNegotiatedContentResult
类型做的事情与上面的用法#2场景类似。i、 他们在内部管理谈判者
总之,如果您计划支持
text/html
媒体类型,那么您需要编写一个自定义格式化程序并将其添加到Web API的格式化程序集合中,然后当您使用带有接受头text/html
的Ok(“Hello”)
时,您应该在text/html
中看到响应。希望这能有所帮助。问问自己,您希望从这个操作中得到什么HTML响应?跨距、div、标签、表格?由于json和xml的性质,它们或多或少是可预测的,但很难为HTML找到通用的东西。您应该手动生成它,并将其与正确的响应标题一起返回。我将使用RazorEngine在视图中呈现对象,我不是在寻找防弹的“通用”解决方案。因此,它将为每个返回类型手动生成。使用Razor的WebAPI?看起来像一个普通的ASP.NET MVCThanks,Kiran。最后,我在WebApiContrib.Formatting.Razor项目中使用了用法#1,该项目为Razor内置了ViewLocator和媒体类型格式化程序。谢谢你的帮助!
public IHttpActionResult Get()
{
return Ok<string>("Hello");
}