Web API 2返回文本/简单响应

时间:2014-06-20 05:21:28

标签: c# asp.net-mvc json asp.net-web-api2

我希望这里的人可以提供帮助,真的很挣扎。我正在Web API 2中编写RESTful API。每当我向此服务发送请求时,响应始终与Content-Type text/plain一起发送。显然这不好,我的回复需要Content-Type application/json。我尝试了一些我从谷歌发现的建议,但我认为我不了解整体情况。

为了让我的网络服务以application/json内容回复,我需要做些什么特别的事吗?请注意,我希望这在整个应用程序中全局工作,所以我不是在修改给定的响应并设置其内容类型 - 我希望这是整个Web服务的默认行为:如果请求包含Accept的{​​{1}}标题我希望我的网络服务返回application/json而不是Content-Type

修改以澄清:

我的回复包含一个名为“responseData”的对象,该对象应序列化为JSON并包含在正文中。我目前正在将这样的回答放在一起:

text/plain

HttpResponseMessage response = Request.CreateResponse(HttpStatusCode.OK, responseData); return response; 是POCO。这个get被正确地序列化为JSON并在响应中返回 - 唯一缺少的部分是Content-Type,它被错误地设置为“text / plain”。我可以在我编写的每一个响应中手动更改它,但我想在全局级别配置它。

3 个答案:

答案 0 :(得分:9)

好的,假设您的responseData是字符串,Content-type标题在您创建text/plain时将为HttpResponseMessage。不重要的是字符串的内容是什么,因为没有尝试确定它。

解决方案是为您的消息创建适当的内容对象,并使用您要返回的媒体类型进行初始化:

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,而application/json标题中甚至没有提到Accept。以下是响应标题,直至达到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。

答案 1 :(得分:0)

将以下内容添加到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);

}

答案 2 :(得分:0)

所描述问题的另一个可能来源是可能存在授权重定向,就像其中一位工程师想要为api重用用户身份验证一样。

这意味着传入的请求被重定向到登录页面,该页面是text/html无法解析的ReadAsync<>响应。这是一个愚蠢的错误,但不容易发现。

该案例的解决方案是删除用户身份验证并为api实施基于HMAC的身份验证。