Я пытаюсь заставить CORS работать для запроса, который требует предварительной проверки. В этом случае я делаю POST-запрос к бэкэнду с дополнительным заголовком.
Angular:
let myHeaders = new HttpHeaders();
myHeaders = myHeaders.append('Content-Type', 'application/json');
return this.http.post<UserOrder>(`${this.apiURL}/Order/PlaceOrder`, JSON.stringify(payload), {headers : myHeaders}); //email);
C# API:
[HttpPost("PlaceOrder")]
public GenericResponse PlaceOrder(UserOrderInsertModel userOrder)
{
return _orderProvider.PlaceOrder(new UserOrder());
}
Из-за предварительной проверки сначала выполняется запрос OPTIONS. Когда я не определяю отдельную опцию-конечную точку в бэкэнде, я получаю метод 405 Not Allowed. Это заставило меня подумать, что мне нужна отдельная конечная точка опций в моем бэк-энде поверх пост-конечной точки.
[HttpOptions("PlaceOrder")]
public ActionResult PlaceOrderOptions(UserOrderInsertModel userOrder)
{
return Ok();
}
После добавления этого я столкнулся с 415 неподдерживаемым типом носителя (при вызове параметров). Вероятно, это связано с тем, что заголовок Content-Type не поддерживается для запроса HttpOptions.
Мне кажется, что конечная точка дополнительных опций вообще не должна быть необходимой. В настоящее время я использую промежуточное программное обеспечение CORS:
httpContext.Response.Headers.Add("Access-Control-Allow-Origin", "http://localhost:4200");
httpContext.Response.Headers.Add("Access-Control-Allow-Methods", "GET, POST, OPTIONS");
httpContext.Response.Headers.Add("Access-Control-Allow-Headers", "*");
httpContext.Response.Headers.Add("Access-Control-Allow-Credentials", "true");
Дополнительная информация: CORS в целом уже работает. Межсайтовый скриптинг с GET-запросом и заголовком Access-Control-Allow-Origin прошел хорошо. Просто я не могу заставить работать комбо POST / OPTIONS.
Редактировать: в Startup.cs я впервые попытался использовать app.UseCors () следующим образом:
app.UseCors();
options => options.WithOrigins("http://localhost").AllowAnyMethod()
);
К сожалению, это не сработало, поэтому я прибег к установке промежуточного программного обеспечения, как описано выше.
Любая помощь будет принята с благодарностью!