我有以下控制器和操作。
[Route("/api/simple")]
public class SimpleController : Controller
{
[HttpGet]
[Route("test")]
public string Test()
{
return "test";
}
}
当我调用它时,我希望操作返回"test"
(这是有效的JSON),但它返回test
(不带引号)这是一个有效的行为,还是错误?我错过了什么吗?
GET http://localhost:5793/api/simple/test HTTP/1.1
User-Agent: Fiddler
Host: localhost:5793
Accept: application/json
HTTP/1.1 200 OK
Content-Type: text/plain; charset=utf-8
Server: Microsoft-IIS/10.0
X-Powered-By: ASP.NET
Date: Sun, 09 Aug 2015 14:37:45 GMT
Content-Length: 4
test
答案 0 :(得分:4)
正如@mbudnik指出的那样,罪魁祸首是 StringOutputFormatter ,它以某种方式被选中以格式化输出而不是 JsonOutputFormatter 。但是,他的代码片段不再有效,因为从那以后,ASP.NET Core发生了一些变化。请改用:
using System.Linq;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.AspNetCore.Mvc.Formatters;
public class Startup {
// ...
public void ConfigureServices(IServiceCollection services) {
// Add MVC, altering the default output formatters so that JsonOutputFormatter is preferred over StringOutputFormatter
services.AddMvc(options => {
var stringFormatter = options.OutputFormatters.OfType<StringOutputFormatter>().FirstOrDefault();
if (stringFormatter != null) {
options.OutputFormatters.Remove(stringFormatter);
options.OutputFormatters.Add(stringFormatter);
}
});
}
// ...
}
或者,如果您认为自己根本不需要 StringOutputFormatter ,则可以完全删除它:
services.AddMvc(options => {
options.OutputFormatters.RemoveType<StringOutputFormatter>();
});
IMO这应该被认为是一个错误,因为你要求JSON响应(Accept: application/json
)并且返回没有引号的字符串肯定是不是 JSON。但是,the official position is that this is expected。
答案 1 :(得分:3)