c# - HTTP 状态代码 500、.net core CORS 和 HttpClient 错误

标签 c# ajax asp.net-core httpclient

我在 dotnet core 中遇到了一些有关 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 => {
            //...
        }
    });

到网关服务器时,我有时会收到以下错误消息:

No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost:50595' is therefore not allowed access. The response had HTTP status code 500.

但是,如果我调试,我的网关会在内部抛出此错误:

System.Net.Http.HttpRequestException: An error occurred while sending the request. ---> System.Net.Http.WinHttpException: The operation timed out

我尝试通过在网关和每个微服务中添加以下代码来解决第一个错误:

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")]

到每个 Controller 。 我尝试通过在网关中创建 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);
}

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

编辑:如果 Web 应用程序同时进行多个异步 ajax 调用,则该问题似乎更频繁地出现。但这也可能只是一种感觉。

最佳答案

这可能与您的 CORS 设置无关。当发生错误时(例如使用 HttpClient 的 HTTP 调用),默认异常处理程序中间件会删除所有响应 header 并返回错误响应。这意味着您的策略添加的任何 CORS header 都将被删除,因此您将收到有关“请求的资源上不存在‘Access-Control-Allow-Origin’ header 。”的错误。

要克服这个问题,您应该自己处理 Controller 中的任何异常并返回适当的错误结果,或者在之前编写中间件或用您自己的异常处理逻辑替换默认的异常中间件。

还有一个关于此行为的开放 GitHub 问题:https://github.com/aspnet/Home/issues/2378 .

关于c# - HTTP 状态代码 500、.net core CORS 和 HttpClient 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50252175/

相关文章:

c# - 从 Controller 控制我的 asp View 中的 javascript 代码是否将被执行

c# - WinForm 控件事件处理程序顺序

php - 通过ajax向 Controller 发送参数

asp.net-core - 部署错误 : "The requested page cannot be accessed because the related configuration data for the page is invalid"

c# - 如何在没有 "Enviroment"的情况下获取 Windows 通用应用程序中某些特殊文件夹的路径

jquery - 如何在 ajax 操作期间显示 throbber 或其他指示器?

ajax - 如何使用传递给函数的转换标签在函数内部触发 Google Adwords 转换

c# - 如何从 ASP.NET Core 页面调用我的 API Controller 对象?

c# - 此平台不支持 System.Data.SqlClient

c# - Restsharp.RestRequest.RemoveJsonBody() 方法