Tôi có một API web ASP.NET đang được gọi bằng ba SPA khác nhau. Tôi đang sử dụng xác thực cửa sổ cho API web. Ban đầu tôi đã cố gắng để cấu hình CORS trong Web.config như thế này:Làm thế nào để giải quyết vấn đề ASP.NET Web API CORS Preflight khi sử dụng các yêu cầu PUT và DELETE với nhiều nguồn gốc?
<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>
này gây ra vấn đề này preflight:
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.
mà tôi giải quyết bằng cách thêm các phương pháp sau đây trong Global.asax.cs:
protected void Application_BeginRequest()
{
if (Request.Headers.AllKeys.Contains("Origin") && Request.HttpMethod == "OPTIONS")
{
Response.Flush();
}
}
Phương pháp này hoạt động hoàn hảo cho một SPA duy nhất. Tôi nghĩ rằng tôi có thể vào Web.config và thêm các nguồn gốc khác như sau:
<add name="Access-Control-Allow-Origin" value="http://localhost:63342,http://localhost:63347,http://localhost:63345/>
nhưng rõ ràng là không được phép. Đây sản xuất các lỗi sau:
The 'Access-Control-Allow-Origin' header contains multiple values (...), but only one is allowed. Origin (...) is therefore not allowed access.
Vì vậy, để thử và sửa lỗi này, tôi đã thay đổi cách tiếp cận của tôi và thay vào đó quyết định thử để cấu hình CORS trên WebAPIConfig.cs, trong phương pháp ký như thế này:
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);
Tôi nghĩ rằng điều này sẽ làm việc nhưng bây giờ tôi có lỗi preflight một lần nữa khi sử dụng yêu cầu PUT và DELETE và tôi không biết làm thế nào để sửa lỗi này. Tôi đã gỡ rối phương thức Application_BeginRequest và nó vẫn đang xóa yêu cầu OPTIONS vì vậy tôi không có ý tưởng về nguyên nhân gây ra lỗi này. Có ai biết làm thế nào tôi có thể giải quyết vấn đề này?
EDIT:
Các in của lỗi preflight:
@Aravind Tôi xin lỗi tôi không thể thực sự hiểu được giải pháp bạn đề nghị ested vì SO tăng gấp đôi dấu ngoặc kép vì một lý do nào đó. Bạn có thể viết nó theo cách khác không? –
Bạn có thể cho phép tất cả các miền và phương thức bằng cách sử dụng 'EnableCorsAttribute mới (" * "," * "," * ");' Cách tốt hơn để xử lý việc này là tạo thuộc tính tùy chỉnh của riêng bạn bằng cách sử dụng ICorsPolicyProvider và triển khai phương thức GetCorsPolicyAsync. – Paresh
@Paresh Nhưng tôi không thể sử dụng * vì tôi đang sử dụng xác thực cửa sổ và nó không tương thích. Bên cạnh đó tôi chỉ muốn cho phép ba url đó. –