3

我正在使用 VS2019 预览版。我使用最新的 Blazor 扩展 (16.0.19227) 创建了一个“服务器托管”的 Blazor 应用程序。这是包含 3 个独立项目的变体...

  • 我的应用程序客户端
  • 我的应用服务器
  • MyApp.Shared

我可以通过制作 MyApp 来调试它。为活动项目提供服务器,一切正常,但我正在努力将其发布/部署到 Azure。我尝试了以下...

  • 在解决方案资源管理器中右键单击 MyApp.Server
  • 选择“发布”
  • 通过向导创建新的发布配置文件
  • 将部署模式更改为“自包含”
  • 点击发布

此时我在部署过程中遇到错误...

CSC(0,0):错误 CS0006:找不到元数据文件“D:\work\Applications\Web\MyApp.Client\bin\Release\netstandard2.0\win-x86\MyApp.Client.dll”

这似乎是因为 web-deploy 配置文件中的“目标运行时”设置为win-x86。客户端应用程序实际上正在构建为

"D:\work\Applications\Web\MyApp.Client\bin\Release\netstandard2.0\MyApp.Client.dll"

(没有额外的 win-x86 子文件夹)所以部署过程似乎对构建过程使用的路径做出了错误的假设。发布对话框中无法指定空白/无关目标运行时。

是否有解决方法,或者我使用了错误的部署方法?

有一些官方文档,但它不是很有帮助。

更新似乎部署正在使用客户端项目的输出路径,然后只是将netstandard2.0{Target Runtime}附加到它,因此更改客户端项目中的输出路径不足以解决该问题。

更新 2通过编辑 xml删除发布配置文件中的RuntimeIdentifier标记只会导致部署时错误,指出空的 RuntimeIdentifier 与独立部署不兼容。不幸的是,自包含部署是必要的,因为 Azure 尚未直接托管 .net core 3。

4

3 回答 3

4

因为 Azure 尚未直接托管 .net core 3。

但确实如此。

在 Azure 门户中,部署后转到您的 WebApp(或预先创建一个)。

转到 Extensions 并单击 Add [ + ] 并选择 ASP.NET Core 3(x86 用于免费托管)。

还可以转到设置、常规并启用 WebSockets,默认情况下它们是关闭的。


暂时的:

请注意,Preview-6 不能作为扩展使用,因此请使用 Preview-5 或部署为独立的。

于 2019-06-11T13:50:01.860 回答
2

无法在评论中放图片,所以我想我会在这里展示它。这是我当前的发布向导。

在此处输入图像描述

刚刚通过新项目 -> Asp.net 核心 Web 应用程序 -> blazor(托管的 Asp.net 核心)构建并发布了一个全新的项目,以 azure 应用程序服务正常。

于 2019-06-11T13:40:10.427 回答
0

我的回答是:

  • 将发布配置文件配置为“自包含”部署模式。
  • 编辑所有 .csproj 文件以将<TargetFramework>...</TargetFramework>节点名称更改为<TargetFrameworks>...</TargetFrameworks>. (另见:https ://stackoverflow.com/a/42855070 )
  • Startup在运行时在类中修复 Web 根文件夹路径字符串,如下所示。
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.ResponseCompression;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.FileProviders;
using Microsoft.Extensions.Hosting;
using Newtonsoft.Json.Serialization;
using System.IO;
using System.Linq;

namespace BlazorHostedOnAzure.Server
{
    public class Startup
    {
        // This method gets called by the runtime. Use this method to add services to the container.
        // For more information on how to configure your application, visit https://go.microsoft.com/fwlink/?LinkID=398940
        public void ConfigureServices(IServiceCollection services)
        {
            services.AddMvc().AddNewtonsoftJson();
            services.AddResponseCompression(opts =>
            {
                opts.MimeTypes = ResponseCompressionDefaults.MimeTypes.Concat(
                    new[] { "application/octet-stream" });
            });
        }

        // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
        public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
        {
            app.UseResponseCompression();

            // ---- APPEND PART.1 BEGIN ----
            var clientBlazorWebRootPath = default(string);
            // ---- APPEND PART.1 END ----

            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
                app.UseBlazorDebugging();
            }

            // ---- APPEND PART.2 BEGIN ----
            else
            {
                if (env.WebRootPath != null)
                {
                    var pathOfIndex = Path.Combine(env.WebRootPath, "index.html");
                    var pathOfContent = Path.Combine(env.WebRootPath, "_content");
                    if (!File.Exists(pathOfIndex) && Directory.Exists(pathOfContent))
                    {
                        clientBlazorWebRootPath = Directory.GetDirectories(pathOfContent).FirstOrDefault();
                        if (clientBlazorWebRootPath != null)
                        {
                            env.WebRootPath = clientBlazorWebRootPath;
                        }
                    }
                }
            }
            // ---- APPEND PART.2 END ----

            app.UseClientSideBlazorFiles<Client.Startup>();

            app.UseRouting();

            app.UseEndpoints(endpoints =>
            {
                endpoints.MapDefaultControllerRoute();
                endpoints.MapFallbackToClientSideBlazor<Client.Startup>("index.html");
            });

            // ---- APPEND PART.3 BEGIN ----
            if (clientBlazorWebRootPath != null)
            {
                app.UseStaticFiles(new StaticFileOptions
                {
                    FileProvider = new PhysicalFileProvider(clientBlazorWebRootPath)
                });
            }
            // ---- APPEND PART.3 BEGIN ----
        }
    }
}

我在我的存储库的 GitHub 上发布了我的示例代码和 README。

于 2019-07-13T14:54:01.577 回答