2016-06-20 10 views
9

In unserer ASP.NET Core-basierten Webanwendung möchten wir Folgendes: Bestimmte angeforderte Dateitypen sollten benutzerdefinierte ContentType-Typen als Antwort erhalten. Z.B. .map sollte application/json zugeordnet werden. In "full" ASP.NET 4.x und in Kombination mit IIS konnte dafür web.config <staticContent>/<mimeMap> verwendet werden und ich möchte dieses Verhalten durch eine benutzerdefinierte ASP.NET Core-Middleware ersetzen.Middleware zum Festlegen der Antwort ContentType

Also versuchte ich die folgende (der Kürze halber vereinfacht):

public async Task Invoke(HttpContext context) 
{ 
    await nextMiddleware.Invoke(context); 

    if (context.Response.StatusCode == (int)HttpStatusCode.OK) 
    { 
     if (context.Request.Path.Value.EndsWith(".map")) 
     { 
      context.Response.ContentType = "application/json"; 
     } 
    } 
} 

Leider context.Response.ContentType nach dem Aufruf der Rest der Middleware-Kette Ausbeuten an folgende Ausnahme zu setzen versuchen:

System.InvalidOperationException: "Headers are read-only, response has already started." 

Wie kann ich eine Middleware erstellen, die diese Anforderung erfüllt?

Antwort

6

Versuchen Sie HttpContext.Response.OnStarting Rückruf zu verwenden. Dies ist das letzte Ereignis, das ausgelöst wird, bevor die Header gesendet werden.

public async Task Invoke(HttpContext context) 
{ 
    context.Response.OnStarting((state) => 
    { 
     if (context.Response.StatusCode == (int)HttpStatusCode.OK) 
     { 
      if (context.Request.Path.Value.EndsWith(".map")) 
      { 
      context.Response.ContentType = "application/json"; 
      } 
     }   
     return Task.FromResult(0); 
    }, null); 

    await nextMiddleware.Invoke(context); 
} 
1

eine Überlastung von OnStarting Methode verwendet:

public async Task Invoke(HttpContext context) 
{ 
    context.Response.OnStarting(() => 
    { 
     if (context.Response.StatusCode == (int) HttpStatusCode.OK && 
      context.Request.Path.Value.EndsWith(".map")) 
     { 
      context.Response.ContentType = "application/json"; 
     } 

     return Task.CompletedTask; 
    }); 

    await nextMiddleware.Invoke(context); 
} 
Verwandte Themen