博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
让ASP.NET Web API支持text/plain内容协商
阅读量:6209 次
发布时间:2019-06-21

本文共 1375 字,大约阅读时间需要 4 分钟。

ASP.NET Web API的内容协商(Content Negotiation)机制的理想情况是这样的:客户端在请求头的Accept字段中指定什么样的MIME类型,Web API服务端就返回对应的MIME类型的内容(响应头的中Content-Type就是Accept中指定的MIME类型)。

而现实情况是,Web API服务端能返回什么MIME类型的响应类型取决于有没有对应这个MIME类型的MediaTypeFormatter。ASP.NET Web API的默认实现中只提供了2种MediaTypeFormatter(我用的Web API版本是5.2)—— XmlMediaTypeFormatter与JsonMediaTypeFormatter。所以,在请求头的Accept中除非指定为application/xml或者application/json,否则指定其它任何MIME,Web API都会返回application/json(这是默认的响应类型)。

今天就被这个现实情况折腾了半天,accept中指定text/plain,Web API总是返回json格式的数据。后来通过网络抓包才发现这个问题。真搞不懂ASP.NET Web API为什么不默认实现一个PlainTextTypeFormatter。

被逼无奈,只能自己实现一个PlainTextTypeFormatter:

  • 继承MediaTypeFormatter
  • 构造函数中添加MediaTypeHeaderValue("text/plain")
  • 重写三个方法:CanReadType(), CanWriteType() 与 WriteToStreamAsync()

完整实现代码如下:

public class PlainTextTypeFormatter : MediaTypeFormatter{    public PlainTextTypeFormatter()    {        SupportedMediaTypes.Add(new MediaTypeHeaderValue("text/plain"));    }    public override bool CanReadType(Type type)    {        return false;    }    public override bool CanWriteType(Type type)    {        return type == typeof(string);    }    public override async Task WriteToStreamAsync(Type type, object value, Stream writeStream, HttpContent content, TransportContext transportContext)    {        using (var sw = new StreamWriter(writeStream))        {            await sw.WriteAsync(value.ToString());        }                  }}

转载地址:http://oobja.baihongyu.com/

你可能感兴趣的文章
UNIX域套接字编程和socketpair 函数
查看>>
[LeetCode] Set Intersection Size At Least Two 设置交集大小至少为2
查看>>
最短的计算大数乘法的c程序
查看>>
BZOJ1101: [POI2007]Zap(莫比乌斯反演)
查看>>
javaCompileOptions { annotationProcessorOptions { includeCompileClasspath = true } }
查看>>
Maven update project...后jdk变成1.5,update project后jdk版本改变
查看>>
Android 关于BottomDialogSheet 与Layout擦出爱的火花?
查看>>
【docker】启动docker连接数据库 出现FATAL: password authentucation failed for user "homestatead"问题...
查看>>
python二维数组初始化
查看>>
【Android应用开发技术:用户界面】布局管理器
查看>>
2 salt-masterless架构
查看>>
C# 线程池ThreadPool的用法简析
查看>>
eclipse 如何修改maven插件本地仓库jar包默认存储位置
查看>>
Zookeeper浏览器工具和Eclipse插件
查看>>
RxSwift 之变换操作
查看>>
greendao 查询之数据去重
查看>>
配置gitignore后使其生效命令
查看>>
tf.placeholder使用说明
查看>>
手机web页面调用手机QQ实现在线聊天的效果
查看>>
【WPF】UI虚拟化之------自定义VirtualizingWrapPanel
查看>>