HTTP 状态码 500、.net core CORS 和 HttpClient 错误

我在 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”标头。因此,不允许访问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 作为单例并修改以下属性来解决的第二个问题:


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);

}

正如我所说,有时它有效,有时则不起作用。也许你可以给我一些想法我的错误是什么。提前致谢!


慕妹3242003
浏览 334回答 3
3回答

喵喵时光机

谢谢你让我走向正确的方向。我想我找到了解决方法/修复。我必须在我的网关中设置以下属性:ServicePointManager.DefaultConnectionLimit&nbsp;=&nbsp;int.MaxValue;
打开App,查看更多内容
随时随地看视频慕课网APP