3

对于 PUT 和 DELETE 请求,我得到了低于 CORS 错误,GET 和 POST 请求工作正常:

Access to XMLHttpRequest at 'https://localhost:444/api/...' from origin 'http://localhost:3000' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.

关于我的应用程序的背景:前端在 React(next.js) 中,后端在 .NET 5 中。在后端项目中,我已经设置了 CORS 策略以允许任何标头、方法和特定来源,但现在仍然有效。当我在 IIS Express 上运行 API 项目时,它可以工作,但是当我将它部署到 IIS 时,它失败并出现上述错误。

以下是 .NET 5 项目中的 CORS 策略:

-- public void ConfigureServices(IServiceCollection services)

            services.AddCors(options =>
            {
                options.AddDefaultPolicy(
                    builder =>
                    {
                        builder
                          .AllowAnyHeader()
                          .AllowAnyMethod()
                          .WithOrigins("http://localhost:3000");
                    });

-- public void Configure(IApplicationBuilder app, IWebHostEnvironment env)

app.UseRouting();
app.UseCors();
app.UseAuthorization();

这是 PUT 的 OPTIONS 请求:

**General:**
Request Method: OPTIONS
Status Code: 204 
Remote Address: [::1]:444
Referrer Policy: strict-origin-when-cross-origin
**Response Headers:**
access-control-allow-headers: content-type
access-control-allow-methods: PUT
access-control-allow-origin: *
date: Fri, 24 Sep 2021 01:49:11 GMT
server: Microsoft-IIS/10.0
x-powered-by: ASP.NET

任何想法?

4

4 回答 4

0

我猜你的问题是WebDAVModule禁用 PUT 和 DELETE 方法。您必须<system.webServer>在 web.config 文件中包含以下代码块<handlers>,如下所示:

<modules>
    <remove name="WebDAVModule" />
</modules>
<handlers>
</handlers>

于 2021-10-04T13:25:28.450 回答
0

问题不在于 CORS 策略,而WebDAVModule在于 web.config。如果您尝试来自浏览器或 Postman 的PUTorDELETE请求,您将收到来自 Web 服务器的 405 Not allowed 错误。

来自网络服务器的 405 错误

我已经从 React 应用程序中尝试过相同的方法。我得到了以下回复。

反应应用程序请求错误

控制台显示from origin 'http://localhost:9100' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.,但网络选项卡显示错误的状态代码为 405。

要解决此问题,您必须在 web.config 中添加以下配置。

     <modules>
        <remove name="WebDAVModule" />
     </modules>
      <handlers>
        <remove name="WebDAV" />
        <remove name="ExtensionlessUrlHandler-Integrated-4.0" />
        <add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="GET,HEAD,POST,PUT,DELETE,DEBUG" type="System.Web.Handlers.TransferRequestHandler" resourceType="Unspecified" requireAccess="Script" preCondition="integratedMode,runtimeVersionv4.0" responseBufferLimit="0" />
      </handlers>

即使我已经从 Startup 类中删除了端口号,并为 CORS 添加了以下内容。

          // global cors policy
            app.UseCors(builder => builder
                .AllowAnyHeader()
                .AllowAnyMethod()
                .SetIsOriginAllowed((host) => true)
                .AllowCredentials()
            );

请参阅此处的 .Net 核心应用程序此处的React 应用程序沙箱。

在此处阅读有关 405 方法不允许错误的更多信息

于 2021-10-04T13:31:13.863 回答
-1

我相信当您部署代码时,客户端 url 将从 http://localhost:3000 更改为 [http://example.com/8080][1] 将此 url 放入 WithOrigins 方法中 -

-- public void ConfigureServices(IServiceCollection services)

        services.AddCors(options =>
        {
            options.AddDefaultPolicy(
                builder =>
                {
                    builder
                      .AllowAnyHeader()
                      .AllowAnyMethod()
                      ***.WithOrigins("http://example.com/8080");***
                });
于 2021-09-30T19:56:56.890 回答
-1

首先,您需要更改您正在使用的端口 端口 444 是保留的,通过commention,您需要从端口 3000 开始,操作系统可能会使用前 2000 个端口。端口 444 可以免费使用,如果

维基百科说

简单网络寻呼协议 (SNPP) 是一种协议,它定义了寻呼机可以通过 Internet 接收消息的方法。大多数主要寻呼提供商都支持它,并且可以替代许多电信服务使用的寻呼调制解调器。该协议最近在 RFC 1861 中进行了描述。它是一个相当简单的协议,可以在 TCP 端口 444 上运行,并且只使用少数有据可查的命令发送页面。

如果您在 yow package.json 有一个 CRA,则其他有用的东西添加一个新的 prop 调用proxy和 yow 的 url,如果您添加它,您的所有 cors 问题都会消失

"proxy": "http://localhost:8080"

现在你所有的获取都需要有一个相对的 url

代替

fetch("http://localhost:8080/api/login")

他们必须像

fetch("/api/login")

注意:package.json 上的代理道具如何不以/结尾,以及它们如何获取以它开头/如果您将其添加到您的包中,您将能够添加 cookie 和东西。因为整个事情就像前后有相同的端口

于 2021-10-04T21:59:51.633 回答