Visual Studio Mac 中的“发布到文件夹”,我的静态文件在运行时丢失,但在发布的文件中

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

当我在 Windows 或 MacOS 中从 Visual Studio 内部运行 .net core (7) 项目时,一切都很好。我看到我的网站按预期运行。当我“发布到文件夹”并在 MacOS 中运行生成的控制台应用程序时,网页找不到我的任何静态文件。这包括 bootstrap、jquery 和 telerik 库以及 favicon。文件存在于已发布的 wwwroot 文件夹中 使其正常工作的正确发布设置是什么?我有 app.UseStaticFiles() ,这在 MacOS 上似乎并不重要。 我尝试了一些方法,包括将所有文件放入根文件夹中,并且还尝试了各个文件的发布设置。没有任何帮助。

var app = builder.Build();

// Configure the HTTP request pipeline.
if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Home/Error");
}
app.UseStaticFiles();

app.UseRouting();

app.UseAuthorization();

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

注意:我也尝试删除

app.UseAuthorization()

c# .net-core publish visual-studio-2022 visual-studio-mac
3个回答
1
投票

这是因为在 Osx 上,wwwroot 位置指向错误的位置,而不是运行应用程序的根文件夹。

在配置方法上尝试此操作以在 MAC 上进行测试:

if (System.Runtime.InteropServices.RuntimeInformation.IsOSPlatform(System.Runtime.InteropServices.OSPlatform.OSX))
   app.UseStaticFiles(new StaticFileOptions
       {FileProvider = new PhysicalFileProvider(Path.Combine(System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetEntryAssembly().Location), "wwwroot")),RequestPath = ""});

如果有效,只需添加一个 else:

else
       app.UseStaticFiles();

0
投票

这个答案基于 jmvcollaborator 的答案:https://stackoverflow.com/a/76376825/9008140。 每当我以任何方式更改发布设置时,我都会遇到编译问题。当我选择“发布到单个文件”(这仍然不是单个文件,令人困惑)时,获取路径的反射代码将失败。这是修改后的代码,在使用“发布到单个文件”时似乎可以工作。根据我收到的错误,我相信它正在内部构建一个 docker 容器。

    if (RuntimeInformation.IsOSPlatform(OSPlatform.OSX))
    {
        var process = Process.GetCurrentProcess(); // Or whatever method you are using
        string path = process.MainModule.FileName.Replace("TwinklyWeb", "wwwroot");
        Console.WriteLine("OSX detected.  Looking for static files here: " + path);
        app.UseStaticFiles(new StaticFileOptions
        {
            FileProvider = new PhysicalFileProvider(path),
            RequestPath = ""
        }); ;
    }
    else
    {
        app.UseStaticFiles();
    }

0
投票

我做了两件事:

  1. 右键单击该文件并选择“快速属性”->“复制到输出目录”(如果您的文件实际上存在于输出目录中,则不需要执行此操作)
  2. 我使用此函数在引用文件时获取正确的相对路径:
string getFullPath(string relativePath)
{
    string baseDirectory = AppDomain.CurrentDomain.BaseDirectory;
    return System.IO.Path.Combine(baseDirectory, relativePath);
}
© www.soinside.com 2019 - 2024. All rights reserved.