簡體   English   中英

如何從ASP.NET Core MVC響應的Content-Type中刪除字符集?

[英]How do I remove the charset from Content-Type in a ASP.NET Core MVC response?

無論我嘗試什么,我似乎都無法刪除; charset=utf-8 來自我的響應的Content-Type標頭的; charset=utf-8部分。

[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時, application/fido.trusted-apps+json; charset=utf-8

注意:這符合U2F的FIDO AppID和Facet規范v1.0的規定:

響應必須將MIME內容類型設置為“ application / fido.trusted-apps + json”。

我采用以下方法,使用中間件替換輸出頭。 看起來有點黑,必須使用這樣的中間件:

中間件

public class AdjustHeadersMiddleware
{
    private readonly RequestDelegate _next;

    public AdjustHeadersMiddleware(RequestDelegate next)
    {
        _next = next;
    }

    public async Task Invoke(HttpContext httpContext, CurrentContext currentContext)
    {
        httpContext.Response.OnStarting((state) =>
        {
            if(httpContext.Response.Headers.Count > 0 && httpContext.Response.Headers.ContainsKey("Content-Type"))
            {
                var contentType = httpContext.Response.Headers["Content-Type"].ToString();
                if(contentType.StartsWith("application/fido.trusted-apps+json"))
                {
                    httpContext.Response.Headers.Remove("Content-Type");
                    httpContext.Response.Headers.Append("Content-Type", "application/fido.trusted-apps+json");
                }
            }

            return Task.FromResult(0);
        }, null);


        await _next.Invoke(httpContext);
    }
}

Startup.cs Configure()

app.UseMiddleware<AdjustHeadersMiddleware>();

如果請求您的MVC端點的系統發送了正確的Accept: application/fido.trusted-apps+json ,那么我相信您正在尋找自定義格式器。

看到:

看起來像這樣(從第二個鏈接借來的):

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 ()); 
});

我發現您可以使用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;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM