Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 返回HTML的内容协商_C#_Html_Asp.net Web Api_Content Negotiation - Fatal编程技术网

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");
}