У меня есть некоторые проблемы, связанные с CORS / HttpClient в ядре dotnet. Прежде всего, мое приложение структурировано так:
Webapp -> Microservice-Gateway -> multiple Microservices
Если я делаю Ajax-вызов из моего Webapp
$.ajax({
url: "https://[actual gateway Url]/customer/" + customerId,
type: "GET",
timeout: 60000,
crossDomain: true,
dataType: "json",
success: data => {
//...
}
});
Шлюз-серверу иногда получаю следующее сообщение об ошибке:
Нет заголовка «Access-Control-Allow-Origin» в запрошенном
ресурс. Происхождение 'http://localhost:50595' поэтому не допускается
доступ. Ответ имеет HTTP-код состояния 500.
Внутренне, однако, мой шлюз выдает эту ошибку, если я отлаживаю:
System.Net.Http.HttpRequestException: при отправке произошла ошибка
запрос. ---> System.Net.Http.WinHttpException: операция
тайм-аут
Я попытался устранить первую ошибку, добавив следующий код в шлюз и каждый микросервис:
public void ConfigureServices(IServiceCollection services) {
var corsBuilder = new CorsPolicyBuilder();
corsBuilder.AllowAnyHeader();
corsBuilder.AllowAnyMethod();
corsBuilder.AllowAnyOrigin();
corsBuilder.AllowCredentials();
services.AddCors(options => {
options.AddPolicy("SiteCorsPolicy", corsBuilder.Build());
});
//..
}
public void Configure(IApplicationBuilder app, IHostingEnvironment env) {
app.UseCors("SiteCorsPolicy");
//..
}
И просто чтобы быть уверенным, что я также добавил
[EnableCors("SiteCorsPolicy")]
каждому контроллеру.
Вторую проблему, которую я попытался решить, создав HttpClient как Singleton в моем шлюзе и изменив следующие свойства:
var client = new HttpClient();
client.Timeout = new TimeSpan(0, 10, 0);
client.DefaultRequestHeaders.Accept.Clear();
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
services.AddSingleton(client);
Мой шлюз отправляет такие HTTP-запросы:
[HttpGet("{id}")]
public async Task<JsonResult> GetById(int id) {
var response = await _client.GetAsync(new Uri(ServiceUrls.Customer + $"{id}"));
if (!response.IsSuccessStatusCode)
return new JsonResult(BadRequest($"{(int)response.StatusCode}: {response.ReasonPhrase}"));
var customer = JsonConvert.DeserializeObject<CustomerViewModel>(await response.Content.ReadAsStringAsync());
return new JsonResult(customer);
}
Как я уже сказал, иногда это работает, а иногда нет. Может быть, вы могли бы дать мне несколько идей, в чем моя ошибка. Заранее спасибо!
Edit: проблема, кажется, появляется чаще, если есть несколько асинхронных ajax-вызовов из Webapp одновременно. Но это тоже может быть просто чувство.