2017-06-22 1 views
0

何を試しても、; charset=utf-8の部分を返信のContent-Typeヘッダーから削除できないようです。ASP.NET Core MVC応答で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をしたいとき、私はいつもapplication/fido.trusted-apps+json; charset=utf-8を取得します。

注:これは述べてU2FためFIDO AppID and Facet Specification v1.0に準拠することです。

応答は "アプリケーション/ fido.trusted-アプリの+ JSON" のMIMEのContent-Typeのを設定する必要があります。

+0

私は '[生み出し]'属性がなければなりませんの内容を信じて:このようにミドルウェアを使用する必要がちょっとハックようですMediaTypeCollectionのメンバです。おそらく 'application/fido.trusted-aps + json'をコレクションに追加すると、それがうまくいくでしょう。 https://docs.microsoft.com/en-us/aspnet/core/api/microsoft.aspnetcore.mvc.formatters.mediatypecollection#Microsoft_AspNetCore_Mvc_Formatters_MediaTypeCollection –

+0

「MediaTypeCollection」にどこから追加しますか?スタートアップどこか? – kspearrin

+0

カスタムフォーマッタを使用している場合を除いて変更することはできないと思うので、あまり役に立ちません。下の私の答えを見てください。コントローラからの応答ストリームを変更できない場合は、ミドルウェア(?)を使用して、応答全体を自分で処理する必要があります。カスタムフォーマッタはあなたの最善の策のようです。 –

答えて

1

ミドルウェアを使用して、途中でヘッダーを置き換える次のアプローチを行った。

ミドルウェア

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設定()

app.UseMiddleware<AdjustHeadersMiddleware>(); 
0

あなたのMVCのエンドポイントを要求して、システムが適切Accept: application/fido.trusted-apps+jsonを送信した場合、私はcustom formatterは、あなたが探しているものであると信じています。

参照:

それは(第2リンクから借りた)このようなものになります。そして、

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

} 

それを登録あなたの起動時:

関連する問題