[英]Web API 2 returning text/plain responses
真的很挣钱,我希望这里的人可以提供帮助。 我正在Web API 2中编写RESTful API。每当我向此服务发送请求时,响应始终与Content-Type
of text/plain
。 显然这不好,我的回复需要是Content-Type
of application/json
。 我已经尝试了一些我从谷歌发现的建议,但我认为我并不了解整体情况。
为了让我的Web服务响应application/json
内容,我需要做些什么特别的事情吗? 请注意,我希望这在整个应用程序中全局工作,所以我不是在修改给定的响应并设置其内容类型 - 我希望这是整个Web服务的默认行为:如果请求包含application/json
的Accept
标头我希望我的Web服务返回Content-Type
而不是text/plain
。
编辑澄清:
我的响应包含一个名为“responseData”的对象,该对象应序列化为JSON并包含在正文中。 我目前正在将这样的回答放在一起:
HttpResponseMessage response = Request.CreateResponse(HttpStatusCode.OK, responseData);
return response;
responseData
是一个POCO。 这个get被正确地序列化为JSON并在响应中返回 - 唯一缺少的部分是Content-Type,它被错误地设置为“text / plain”。 我可以在我编写的每个响应上手动更改它,但我想在全局级别配置它。
好的,假设您的responseData
是一个字符串,在创建HttpResponseMessage
时, Content-type
标头将是text/plain
。 无论字符串的内容是什么,因为没有尝试确定这一点。
解决方案是为您的消息创建适当的Content对象,使用您要返回的媒体类型进行初始化:
HttpResponseMessage response = new HttpResponseMessage()
{
Content = new StringContent(
responseData,
Encoding.UTF8,
"application/json"
)
};
还有其他方法相当于返回特定的对象类型,并允许API库根据需要为您序列化为JSON或XML。 我更愿意让框架尽可能地为我工作,但这就是你用你自己创建的字符串来实现它的方法。
对于严格的仅JSON结果,从WebAPI配置中删除XML格式化程序并返回您的POCO。
在App_Start\\WebApiConfig.cs
,将以下内容添加到WebApiConfig.Register
方法:
config.Formatters.Remove(config.Formatters.XmlFormatter);
对于您的API:
public class MyObject
{
public bool result;
public string reason;
}
public class TestController : ApiController
{
public MyObject GetData()
{
MyObject result = new MyObject { result = "true", reason = "Testing POCO return" };
return result;
}
}
我运行了这个并从Chrome请求/api/Test
,它甚至没有在Accept
标头中提到application/json
。 以下是响应标题,直到它命中Content-Type
:
HTTP/1.1 200 OK
Cache-Control: no-cache
Pragma: no-cache
Content-Type: application/json; charset=utf-8
和身体:
{"result":true,"reason":"Testing POCO return"}
由于我禁用了XML,因此默认为JSON。
将以下内容添加到Global.asax文件中。
protected void Application_Start()
{
JsonSerializerSettings serializerSettings = new JsonSerializerSettings();
serializerSettings.Converters.Add(new IsoDateTimeConverter());
var jsonFormatter = new JsonNetFormatter(serializerSettings);
jsonFormatter.SupportedMediaTypes.Add(new MediaTypeHeaderValue("text/html"));
GlobalConfiguration.Configuration.Formatters.Insert(0, jsonFormatter);
}
所描述的问题的另一个可能的来源是可能存在授权重定向,就像我们当其中一个工程师想要为api重用用户认证一样。
这意味着传入的请求被重定向到登录页面,该页面是ReadAsync<>
无法解析的text/html
响应。 这是一个愚蠢的错误,但不容易发现。
在这种情况下的解决方案是删除用户身份验证并为api实现基于HMAC的身份验证。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.