如何从ASP.NET Core MVC响应中的Content-Type中删除charset?

时间:2017-06-22 20:09:56

标签: asp.net asp.net-mvc

无论我尝试什么,我似乎无法从我的回复; charset=utf-8标题中移除Content-Type部分。

[HttpGet("~/appid")]
// Doesn't work
//[Produces("application/fido.trusted-apps+json")]
public string GetAppId()
{
    // Doesn't work
    Response.ContentType = "application/fido.trusted-apps+json";

    // Doesn't work
    //Response.ContentType = null;
    //Response.Headers.Add("Content-Type", "application/fido.trusted-apps+json");

    return JsonConvert.SerializeObject(new
    {
        foo = true
    });
}

当我只想要application/fido.trusted-apps+json; charset=utf-8时,我总是得到application/fido.trusted-apps+json

注意:这是为了符合U2F的FIDO AppID and Facet Specification v1.0,其中规定:

  

响应必须设置MIME内容类型“application / fido.trusted-apps + json”。

2 个答案:

答案 0 :(得分:0)

如果请求您的MVC端点的系统发送了正确的Accept: application/fido.trusted-apps+json,那么我相信custom formatter是您正在寻找的。ASP.Net Core Custom Formatters

请参阅:

它看起来像这样(从第二个链接借来):

public class FidoTrustedAppOutputFormatter : IOutputFormatter 
{

    public FidoTrustedAppOutputFormatter 
    {
        SupportedMediaTypes.Add(MediaTypeHeaderValue.Parse("application/fido.trusted-apps+json"));
    }

    public bool CanWriteResult(OutputFormatterCanWriteContext context) 
    { 
        if (context == null) throw new ArgumentNullException(nameof(context)); 
        if (context.ContentType == null || context.ContentType.ToString() == "application/fido.trusted-apps+json") 
            return true;

        return false; 
    } 

    public async Task WriteAsync(OutputFormatterWriteContext context) 
    { 
        if (context == null) throw new ArgumentNullException(nameof(context)); 
        var response = context.HttpContext.Response; response.ContentType = "application/fido.trusted-apps+json"; 

        using (var writer = context.WriterFactory(response.Body, Encoding.UTF8)) 
        { 
            // replace with Json.net implementation
            Jil.JSON.Serialize(context.Object, writer); 
            await writer.FlushAsync(); 
        }
    }

}

public class FidoTrustedAppInputFormatter : IInputFormatter 
{

    public FidoTrustedAppInputFormatter 
    {
        SupportedMediaTypes.Add(MediaTypeHeaderValue.Parse("application/fido.trusted-apps+json"));
    }

    public bool CanRead(OutputFormatterCanWriteContext context) 
    { 
        if (context == null) throw new ArgumentNullException(nameof(context)); 
        if (context.ContentType == null || context.ContentType.ToString() == "application/fido.trusted-apps+json") 
            return true;

        return false; 
    } 

    public Task<InputFormatterResult> ReadAsync(InputFormatterContext context) 
    { 
        if (context == null) throw new ArgumentNullException(nameof(context)); 

        var request = context.HttpContext.Request; if (request.ContentLength == 0) 
        { 
            if (context.ModelType.GetTypeInfo().IsValueType) 
                return InputFormatterResult.SuccessAsync(Activator.CreateInstance(context.ModelType)); 
            else return InputFormatterResult.SuccessAsync(null); 
        } 

        var encoding = Encoding.UTF8;//do we need to get this from the request im not sure yet 

        using (var reader = new StreamReader(context.HttpContext.Request.Body)) 
        { 
            var model = Jil.JSON.Deserialize(reader, context.ModelType); 
            return InputFormatterResult.SuccessAsync(model); 
        } 
    } 

}

然后在你的创业公司注册:

services.AddMvcCore(options =>  
{ 
    options.InputFormatters.Insert(0, new FidoTrustedAppInputFormatter ());
    options.OutputFormatters.Insert(0, new FidoTrustedAppOutputFormatter ()); 
});

答案 1 :(得分:0)

我发现您可以使用ContentResult在控制器中覆盖它。因此,您可以通过执行以下示例来实现所需的目标

string bodyJson = JsonConvert.SerializeObject(new
{
    foo = true
})

var response = new ContentResult()
{
    Content = bodyJson,
    ContentType = "application/fido.trusted-apps+json",
    StatusCode = (int)System.Net.HttpStatusCode.OK,
};

return response;