【问题标题】:POST request to .net core web api from Chrome is not working来自 Chrome 的 .net core web api 的 POST 请求不起作用
【发布时间】:2017-11-06 05:23:23
【问题描述】:

我正在开发一个 .net core web api 项目,这个块让我做噩梦。我正在尝试将请求从 ionic-angular 发送到 .net 核心项目。 GET 请求运行良好。但 POST 请求不是。当我尝试在 chrome 中测试项目时,它对 OPTIONS 请求说 net::ERR_CONNECTION_RESET。我了解 Chrome 在我真正的 POST 请求之前发送预检 OPTIONS 请求。但这就是问题所在。我尝试使用这样的中间件处理该 OPTIONS 请求

using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Hosting; namespace A.Middlewares { public class OptionsMiddleware { private readonly RequestDelegate _next; private IHostingEnvironment _environment; public OptionsMiddleware(RequestDelegate next, IHostingEnvironment environment) { _next = next; _environment = environment; } public async Task Invoke(HttpContext context) { this.BeginInvoke(context); await this._next.Invoke(context); } private async void BeginInvoke(HttpContext context) { if (context.Request.Method == "OPTIONS") { context.Response.Headers.Add("Access-Control-Allow-Origin", new[] { "http://localhost:8100" }); context.Response.Headers.Add("Access-Control-Allow-Headers", new[] { "Origin, X-Requested-With, Content-Type, Accept" }); context.Response.Headers.Add("Access-Control-Allow-Methods", new[] { "GET, POST, PUT, DELETE, OPTIONS" }); context.Response.Headers.Add("Access-Control-Allow-Credentials", new[] { "true" }); context.Response.StatusCode = 200; await context.Response.WriteAsync("OK"); } else { context.Response.Headers.Add("Access-Control-Allow-Origin", new[] { "http://localhost:8100" }); context.Response.Headers.Add("Access-Control-Allow-Headers", new[] { "Origin, X-Requested-With, Content-Type, Accept" }); context.Response.Headers.Add("Access-Control-Allow-Credentials", new[] { "true" }); } } } public static class OptionsMiddlewareExtensions { public static IApplicationBuilder UseOptions(this IApplicationBuilder builder) { return builder.UseMiddleware(); } } }

但它仍然没有帮助。如果有什么技巧,请赐教!

【问题讨论】:

  • 托管网页的网址是什么?您尝试发布到的 URL 是什么?

标签: c# google-chrome ionic-framework asp.net-core-2.0


【解决方案1】:

Chrome 发送 OPTIONS 的原因是因为您的 .net 服务器位于另一个 URL(域),而不是发布帖子的网页(组件)。这是为了保护您免受使用 CORS - 跨域请求共享的跨域类型的攻击。

您可以在 Startup.cs 中启用 CORS:

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
        {
          // All the other things here
           if (env.IsDevelopment()) // For development only, we allow CORS from anywhere.
            {
                app.UseCors(builder => builder.AllowAnyHeader().AllowAnyMethod().AllowAnyOrigin().AllowCredentials().Build());
            }
         }

您需要安装此软件包:Microsoft.AspNetCore.Cors

进一步阅读:https://docs.microsoft.com/en-us/aspnet/core/security/cors

【讨论】:

  • 这可能与我上面的代码相同。我认为问题与标题无关。但这可能是处理 options 方法。如何将 200 返回到 OPTIONS 方法并移至下一个请求?这就是诀窍。请检查我上面的代码。
  • 向CORS返回200是不够的;您必须指定允许的方法和允许的标头。这就是为什么使用微软提供的库比自己编写代码更容易......
  • 伙计,你明白了。我将您的代码放在我的 Startup.cs 中,但仍然没有修复它。您可能会看到我已经在上面的代码中指定了允许的方法和标头。无论如何,感谢您的宝贵时间。
【解决方案2】:

需要在WebAPI的global.aspx中添加以下几行代码

 protected void Application_BeginRequest()
        {
            if (Request.Headers.AllKeys.Contains("Origin") && Request.HttpMethod == "OPTIONS")
            {
                Response.Flush();
            }
        }

【讨论】:

    【解决方案3】:

    为此,您必须在 chrome 浏览器中安装一个扩展程序,该扩展程序将跨域请求发送到服务器。网址如下。

    https://chrome.google.com/webstore/detail/allow-control-allow-origi/nlfbmbojpeacfghkpbjhddihlkkiljbi?hl=en

    【讨论】:

    • 还有很多其他的跨域请求扩展也可以在其他浏览器中使用...
    • 请注意,这样做会损害浏览器的安全性
    • 是的,我知道,但是许多扩展程序也提供了开关,当我们需要在 ionic 或任何跨浏览器请求中测试任何东西时,我们打开开关..
    猜你喜欢
    • 2020-03-30
    • 2019-04-30
    • 1970-01-01
    • 1970-01-01
    • 2019-12-28
    • 2021-10-05
    • 2021-11-20
    • 1970-01-01
    • 2018-04-22
    相关资源
    最近更新 更多