【问题标题】:How to check and alter Web API Request Content-Type header?如何检查和更改 Web API 请求 Content-Type 标头?
【发布时间】:2018-08-27 10:50:08
【问题描述】:

我的 ASP.NET Web API 中有一个 POST 方法,该方法将被无法发送 Content-Type 标头的客户端使用。 我想检查请求的Content-Type 标头,如果它为空,我想将其设置为application/x-www-form-urlencode

我如何做到这一点?

附:如果请求没有Content-Type: application/x-www-form-urlencode,我得到:

请求包含实体主体,但没有 内容类型标头。推断的媒体类型 不支持“应用程序/八位字节流” resource.No MediaTypeFormatter 是 可用于从内容中读取“CustomerModel”类型的对象 媒体类型 '应用程序/八位字节流'.System.Net.Http.UnsupportedMediaTypeException 在 System.Net.Http.HttpContentExtensions.ReadAsAsync[T](HttpContent 内容,类型类型,IEnumerable1 formatters, IFormatterLogger formatterLogger, CancellationToken cancellationToken) at System.Net.Http.HttpContentExtensions.ReadAsAsync(HttpContent content, Type type, IEnumerable1 格式化程序,IFormatterLogger 格式化程序记录器, CancellationToken 取消令牌)在 System.Web.Http.ModelBinding.FormatterParameterBinding.ReadContentAsync(HttpRequestMessage 请求,类型类型,IEnumerable`1 格式化程序,IFormatterLogger 格式化程序记录器,CancellationToken 取消令牌)

【问题讨论】:

  • 你的代码在哪里!你都尝试了些什么?请参阅How to Ask 页面以获得澄清此问题的帮助。
  • 问题解决了吗?

标签: asp.net-web-api content-type


【解决方案1】:

如果请求没有 Content-Type 标头,那么它将被设置为application/octet-stream

HTTP/1.1 RFC 2616 规范的Section 7.2.1 说明了实体主体类型:

当消息中包含实体主体时,该主体的数据类型由标头字段 Content-Type 和 内容编码。这些定义了一个两层的有序编码模型:

entity-body := Content-Encoding( Content-Type( data ) )

Content-Type 指定底层数据的媒体类型。 Content-Encoding 可用于指示任何附加内容 应用于数据的编码,通常用于数据的目的 压缩,这是所请求资源的属性。有 没有默认编码。

任何包含实体主体的 HTTP/1.1 消息都应该包含定义该主体的媒体类型的 Content-Type 标头字段。如果 并且仅当 Content-Type 字段未给出媒体类型时, 接收者可以尝试通过检查其媒体类型来猜测媒体类型 URI 的内容和/或名称扩展名,用于识别 资源。 如果媒体类型仍然未知,收件人应该 将其视为“application/octet-stream”类型。

先尝试清除所有格式化程序,然后只添加您需要的类似

config.Formatters.Clear();
config.Formatters.Add(new FormUrlEncodedMediaTypeFormatter());

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-07-27
    • 1970-01-01
    • 2012-05-27
    • 1970-01-01
    相关资源
    最近更新 更多