Wie löse ich das ASP.NET-Web-API-CORS-Preflight-Problem bei der Verwendung von PUT- und DELETE-Anforderungen mit mehreren Ursprüngen?

Ich habe eine ASP.NET-Web-API, die von drei verschiedenen SPA aufgerufen wird. Ich verwende die Windows-Authentifizierung für die Web-API. Ich habe anfangs versucht, CORS in der Web.config folgendermaßen zu konfigurieren:

<httpProtocol>
    <customHeaders>
        <add name="Access-Control-Allow-Origin" value="http://localhost:63342" />
        <add name="Access-Control-Allow-Methods" value="GET, POST, PUT, DELETE" />
        <add name="Access-Control-Allow-Headers" value="Origin, X-Requested-With, Content-Type, Accept" />
        <add name="Access-Control-Allow-Credentials" value="true" />
    </customHeaders>
</httpProtocol>

Dies hat dieses Preflight-Problem verursacht:

Response to preflight request doesn’t pass access control check: No ‘Access-Control-Allow-Origin’ header is present on the requested resource. Origin (...) is therefore not allowed access.

das habe ich durch Hinzufügen der folgenden Methode in Global.asax.cs gelöst:

protected void Application_BeginRequest()
{
    if (Request.Headers.AllKeys.Contains("Origin") && Request.HttpMethod == "OPTIONS")
    {
        Response.Flush();
    }
}

Dieser Ansatz funktionierte perfekt für ein einzelnes SPA. Ich dachte, ich könnte in die Web.config gehen und die anderen Ursprünge wie folgt hinzufügen:

<add name="Access-Control-Allow-Origin" value="http://localhost:63342,http://localhost:63347,http://localhost:63345/>

aber anscheinend ist das nicht erlaubt. Dies führte zu folgendem Fehler:

The 'Access-Control-Allow-Origin' header contains multiple values (...), but only one is allowed. Origin (...) is therefore not allowed access.

Um dies zu beheben, habe ich meinen Ansatz geändert und stattdessen beschlossen, CORS in der Datei "WebAPIConfig.cs" in der Methode "Register" wie folgt zu konfigurieren:

var cors = new EnableCorsAttribute("http://localhost:63342,http://localhost:63347,http://localhost:63345", "Origin, X-Requested-With, Content-Type, Accept", "GET, POST, PUT, DELETE");
cors.SupportsCredentials = true;
config.EnableCors(cors);

Ich dachte, das würde funktionieren, aber jetzt habe ich wieder den Preflight-Fehler, wenn ich PUT- und DELETE-Anforderungen verwende, und ich weiß nicht, wie ich das beheben soll. Ich habe die Application_BeginRequest-Methode debuggt und die OPTIONS-Anforderung wird weiterhin geleert, sodass ich keine Ahnung habe, was diesen Fehler verursacht. Weiß jemand, wie ich dieses Problem lösen kann?

BEARBEITEN

Der Ausdruck des Preflight-Fehlers:

Antworten auf die Frage(4)

Ihre Antwort auf die Frage