2017-02-13 6 views
3

Ich löste dieses Problem, nachdem ich die Lösung auf Stackoverflow nicht gefunden habe, also teile ich mein Problem hier und die Lösung in einer Antwort.OPTIONS-Header für CORS auf .NET Core Web API aktivieren

Nachdem eine domänenübergreifende Richtlinie in meiner .NET Core Web API-Anwendung mit AddCors aktiviert wurde, funktioniert sie immer noch nicht von Browsern. Dies liegt daran, dass Browser, einschließlich Chrome und Firefox, zuerst eine OPTIONS-Anfrage senden und meine Anwendung nur mit 204 No Content antwortet.

+0

Was ist ein spezifisches Szenario, in dem dies nicht gelingt? Wenn es "immer schief geht für irgendeinen Chrome/ff-Browser, der CORS macht", wie wird das nicht schon vom Framework abgedeckt? Scheint so, als wäre das eine ziemlich große Unterlassung. – ssmith

+0

Ich stimme zu. So ist es jedoch. Mit diesem Framework können Sie CORS mit integrierten Funktionen ausführen, es werden jedoch keine OPTIONS-Aufrufe ausgeführt. Dies ist Voraussetzung für die normale Verwendung domänenübergreifender API-Aufrufe von Browsern. Sie können dies jedoch vermeiden, indem Sie einen einfacheren Anruf ausführen, wie zum Beispiel den Typ text/plain und einige andere Dinge. Dann führt der Browser den OPTIONS-Aufruf nicht zuerst aus. –

Antwort

6

Fügen Sie Ihrem Projekt eine Middleware-Klasse hinzu, um das OPTIONS Verb zu behandeln.

using System.Threading.Tasks; 
using Microsoft.AspNetCore.Builder; 
using Microsoft.AspNetCore.Http; 
using Microsoft.AspNetCore.Hosting; 

namespace Web.Middlewares 
{ 
    public class OptionsMiddleware 
    { 
     private readonly RequestDelegate _next; 
     private IHostingEnvironment _environment; 

     public OptionsMiddleware(RequestDelegate next, IHostingEnvironment environment) 
     { 
      _next = next; 
      _environment = environment; 
     } 

     public async Task Invoke(HttpContext context) 
     { 
      this.BeginInvoke(context); 
      await this._next.Invoke(context); 
     } 

     private async void BeginInvoke(HttpContext context) 
     { 
      if (context.Request.Method == "OPTIONS") 
      { 
       context.Response.Headers.Add("Access-Control-Allow-Origin", new[] { (string)context.Request.Headers["Origin"] }); 
       context.Response.Headers.Add("Access-Control-Allow-Headers", new[] { "Origin, X-Requested-With, Content-Type, Accept" }); 
       context.Response.Headers.Add("Access-Control-Allow-Methods", new[] { "GET, POST, PUT, DELETE, OPTIONS" }); 
       context.Response.Headers.Add("Access-Control-Allow-Credentials", new[] { "true" }); 
       context.Response.StatusCode = 200; 
       await context.Response.WriteAsync("OK"); 
      } 
     } 
    } 

    public static class OptionsMiddlewareExtensions 
    { 
     public static IApplicationBuilder UseOptions(this IApplicationBuilder builder) 
     { 
      return builder.UseMiddleware<OptionsMiddleware>(); 
     } 
    } 
} 

Dann füge app.UseOptions(); dies als die erste Zeile in Startup.cs im Verfahren Konfigurieren.

public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory) 
{ 
    app.UseOptions(); 
} 
+0

Ich habe genau diese Sache gemacht und kann die Anfrage bekommen, die Middleware zu treffen, aber es gibt eine "Die angeforderte URL kann nicht erreicht werden Der Dienst ist möglicherweise vorübergehend nicht verfügbar oder er ist möglicherweise dauerhaft auf eine neue Webadresse verschoben worden. [chrome socket error]: Eine Verbindung wurde zurückgesetzt (entspricht einem TCP RST) "Fehler. Was mache ich falsch? – crackedcornjimmy

+0

Ich weiß es nicht. Zur Fehlerbehebung würde ich Fiddler öffnen und die Details der Anfrage und Antwort prüfen. –

+3

+1, aber eine Sache muss angepasst werden, nicht _next.Invoke aufrufen, wenn Methode Optionen ist, sollte die Anfrage nach dem Aufruf von 'context.Response.WriteAsync (" OK ") enden;', so ändern Sie 'Invoke' Implementierung zu sei: 'if (context.Request.Method! =" OPTIONS ") { erwarten Sie this._next.Invoke (context); } ' –

0

Ich weiß, es wurde beantwortet. Antworten Sie einfach mit den aktualisierten Informationen. So würde es anderen helfen.

Sein jetzt in asp.net Kern-Framework integriert.

Folgen Sie einfach https://docs.microsoft.com/en-us/aspnet/core/security/cors

und ersetzen

app.UseCors(builder => 
    builder.WithOrigins("http://example.com")); 

mit

 app.UseCors(builder => 
     builder.WithOrigins("http://example.com") 
       .AllowAnyHeader() 
       .AllowAnyMethod() 
       .AllowCredentials()); 
Verwandte Themen