【发布时间】:2018-05-09 11:22:43
【问题描述】:
我在 dotnet 核心中遇到了一些关于 CORS/HttpClient 的问题。首先,我的应用程序结构如下:
Webapp -> Microservice-Gateway -> multiple Microservices
如果我从我的 Web 应用程序进行 Ajax 调用
$.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);
}
正如我所说,有时有效,有时无效。也许你可以给我一些想法什么是我的错误。提前致谢!
编辑:如果一次有多个来自 Webapp 的异步 ajax 调用,问题似乎会更频繁地出现。但这也可能只是一种感觉。
【问题讨论】:
-
你能分享一下你在哪里定义了你的“SiteCorsPolicy”政策@Simon?
-
"options.AddPolicy("SiteCorsPolicy", corsBuilder.Build());"在第五个代码段
-
问题是 500 错误,与你的 CORS 配置无关。只是和大多数服务器一样,这个只是将 Access-Control-Allow-Origin 和其他自定义配置的响应头添加到 2xx 成功消息,而不是 5xx 和 4xx 错误。
-
谢谢@sideshowbarker!这将其缩小到 HttpClient。我多次读过 HttpClient 是线程安全的,这是错的吗?我真的想不出它失败的另一个原因。
-
stackoverflow.com/questions/11178220/… 似乎是关于 HttpClient 线程安全的规范答案。
标签: c# ajax asp.net-core httpclient