使用 CORS 在 WebAPI 中将 text/plain 作为复杂对象发布

Posted

技术标签:

【中文标题】使用 CORS 在 WebAPI 中将 text/plain 作为复杂对象发布【英文标题】:Posting text/plain as a complex object in WebAPI with CORS 【发布时间】:2013-03-15 07:21:19 【问题描述】:

所以我希望使用 CORS 从 AJAX 帖子中将复杂对象 POST(或 PUT)到服务器。不幸的是,IE8 只支持在使用 CORS 时发送 text/plain 而不是application/json

有没有办法在WebAPI 中实现一个处理程序来自定义解析文本/纯文本提交。

我的意思是复杂的对象

public void POST([FromBody] MyCustomObject myResponse)

   return null;

通常我会在一些带有适当设置的标头的 JSON 中发布,但是由于 IE8 的限制,一旦您设置标头,它就会失败并拒绝访问,所以需要是文本/纯文本,所以我打算做的是发送一个 JSON 字符串,但称为 text/plain(我知道很难看!)但是因为没有更好的选择......

【问题讨论】:

【参考方案1】:

如果您的 WebApi 应用程序真的只使用 JSON,您可以使用此解决方案,它始终以 JSON 响应并忽略请求内容类型:

How can I force asp.net webapi to always decode POST data as JSON

据此,我建议以下解决方案:

此代码需要添加到Application_Start或WebApiConfig.Register中

config.Formatters.JsonFormatter.SupportedMediaTypes.Add(new MediaTypeHeaderValue("text/plain"));
config.Formatters.Remove(config.Formatters.FormUrlEncodedFormatter);
config.Formatters.Remove(config.Formatters.XmlFormatter);

它告诉 json 格式化程序接受纯文本内容类型,并删除 form 和 xml 格式化程序(尽管可能不需要删除它们)

【讨论】:

谢谢。这对我有用,我用它来防止在 POST、DELETE 和 PUT 时进行预检。【参考方案2】:

很难看,但您可以尝试在消息处理程序中将内容类型标头从 text/plain 修改为 application/json,以便使用 json 格式化程序正确进行参数绑定。

【讨论】:

以上是关于使用 CORS 在 WebAPI 中将 text/plain 作为复杂对象发布的主要内容,如果未能解决你的问题,请参考以下文章

用于 XmlHttpRequest 的带有 WebAPI 的 CORS

CORS解决WebApi跨域问题(转)

在 ASP.Net Core 5 WebAPI 中启用 CORS

IIS 中托管的 WebAPI 中的 CORS 问题

CORS 多个标头

WebApi 2.2 + Chrome = CORS 405 错误