ASP .Net MVC6操作返回字符串

时间:2015-08-09 14:41:10

标签: asp.net-mvc asp.net-web-api asp.net-core

我有以下控制器和操作。

[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

2 个答案:

答案 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)

似乎 StringOutputFormatter 正在影响你。 如果您删除它或在 JsonOutputFormatter 之后移动它,您将获得所需的结果。

Output formatters