部署了 ASP.NET Core 应用程序的 React Vite Web Api,但 axios 失败并出现 404 错误

问题描述 投票:0回答:1

我创建了一个全栈 Web API 应用程序,其中前端是带有 React.js 的 ASP.NET Core(我使用 React vite),后端是 C# 类库。 我成功地将 IIS 上的前端部署到 loacalhost:80。当我从 IIS 浏览该网站时,我看到了我创建的加载图标,这表明前端已正确部署,但问题是加载永远不会停止,因为 axios 请求“/api/account/” getcurrentuser”给出 404 错误。后端找不到http://localhost:80/api/account/getcurrentuser。

这是详细的错误信息。

所有 axios 请求都会发生这种情况。服务器返回 404 表示找不到资源。它查找的物理路径是 C:\Website\EDIConverterDemo\wwwroot pi ccount\getcurrentuser。 wwwroot 文件夹是我的项目的部署文件夹中的文件夹。它应该看起来在那里并且我需要添加一些东西,还是它被定向到错误的地方?

该应用程序在本地运行时完美运行(不是在 IIS 上),并且我的控制器中的路由与我的 axios GET 请求中的 url 相匹配。

我认为我可能还需要部署后端类库,但对此的一些研究告诉我,我不需要单独部署它。 我认为我的问题是一个反应问题,特别是因为我正在使用 vite。

这是我的 vite.config.js 文件。 是CORS问题还是vite代理问题?当我在本地(不是在 IIS 上)运行我的项目时,React 前端基于端口 3000,而所有以“/api”开头的调用都会重新路由到托管在端口 7264 上的控制器。我是否需要更改代理中的端口?

import { defineConfig } from 'vite'
import react from '@vitejs/plugin-react';

export default defineConfig({
  plugins: [react()],
  server: {
    port: 3000,
    strictPort : true,
    proxy: {
      '/api' : {
        target: 'https://localhost:7264',
        changeOrigin: true,
        secure: false,enter image description here
        rewrite: (path) => path.replace(/^\/api/, '/api')
      }
    }
  }
})

或者可能是后端的问题?

这是 /api/account/getcurrentuser 应该转到的控制器:

namespace EDIConverterWeb.Web.Controllers
{
    [Route("api/[controller]")]
    [ApiController]
    public class AccountController : ControllerBase
    {
        [HttpGet]
        [Route("getcurrentuser")]
        public User GetCurrentUser()
        {
            //here is some code that returns null if no user is signed in
            //otherwise, returns the currently logged-in user (object)
        }
    }
}

这是我的 Program.cs 文件:

是否配置错误导致控制器丢失?

namespace EDIConverterWeb.Web
{
    public class Program
    {
        private static string CookieScheme = "EDIConverter";
        public static void Main(string[] args)
        {
            var builder = WebApplication.CreateBuilder(args);

            builder.Services.AddAuthentication(CookieScheme)
           .AddCookie(CookieScheme, options =>
           {
               options.Events = new CookieAuthenticationEvents
               {
                   OnRedirectToLogin = context =>
                   {
                       context.Response.StatusCode = 403;
                       context.Response.ContentType = "application/json";
                       var result = System.Text.Json.JsonSerializer.Serialize(new { error = "You are not authenticated" });
                       return context.Response.WriteAsync(result);
                   }
               };
           });

            builder.Services.AddSession();

            // Add services to the container.

            builder.Services.AddControllersWithViews();

            var app = builder.Build();

            // Configure the HTTP request pipeline.
            if (!app.Environment.IsDevelopment())
            {
                // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
                app.UseHsts();
            }

            app.UseHttpsRedirection();
            app.UseStaticFiles();
            app.UseRouting();

            app.UseSession();
            app.UseAuthentication();
            app.UseAuthorization();

            app.MapControllerRoute(
                name: "default",
                pattern: "{controller}/{action=Index}/{id?}");

            app.MapFallbackToFile("index.html"); ;

            app.Run();
        }
    }
}

这就是我的 web.config 文件的样子:

<?xml version="1.0"?>
<configuration>
    <system.webServer>
        <rewrite>
            <rules>
                <rule name="React Routes" stopProcessing="true">
                    <match url=".*" />
                    <conditions logicalGrouping="MatchAll">
                        <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
                        <add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" />
                        <add input="{REQUEST_URI}" pattern="^/(api)" negate="true" />
                    </conditions>
                    <action type="Rewrite" url="/" />
                </rule>
            </rules>
        </rewrite>
    </system.webServer>
</configuration>

更新: 我不认为这是 React 的问题,你能帮我弄清楚如何让我的应用程序的 API 部分在部署上运行吗?

c# reactjs deployment asp.net-core-webapi vite
1个回答
0
投票

我的 Vite-React 应用程序也遇到了类似的问题。 我相信下面列出的解决方案与您的问题直接相关。

ReactVite Express NodeJs Azure 应用程序服务。 404 您要查找的资源已被删除、更名或暂时不可用

通过部署到 Azure 容器的 Azure 应用服务使用我的 NodeJS 应用程序运行 Express 服务器

物理路径 C:\Website\EDIConverterDemo\wwwroot pi ccount\getcurrentuser 您现在仅提供静态文件。

它看起来也不像 CORS 问题。

总体来说,我认为是配置问题,物理路径应该是路由文件。

应用程序部署在 IIS 上,但部署在哪里?在 VM 上或作为 Azure Web 应用程序,这非常重要,因为目标链接和端口配置可能会根据 IIS 环境而变化。

© www.soinside.com 2019 - 2024. All rights reserved.