Visual studio 如何从VisualStudio2019部署Blazor服务器托管的应用程序

Visual studio 如何从VisualStudio2019部署Blazor服务器托管的应用程序,visual-studio,blazor,blazor-server-side,Visual Studio,Blazor,Blazor Server Side,我正在使用VS2019预览版。 我使用最新的Blazor扩展(16.0.19227)创建了一个“服务器托管”Blazor应用程序。这是包含3个独立项目的变体 MyApp.Client MyApp.Server MyApp.Shared 我可以通过使MyApp。服务器成为活动项目来调试它,并且一切正常,但我正在努力将其发布/部署到Azure。我试过以下方法 在解决方案资源管理器中右键单击MyApp.Server 选择“发布” 执行向导以创建新的发布配置文件 将部署模式更改为“自包含” 点击发

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

  • MyApp.Client
  • MyApp.Server
  • 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部署配置文件中的“目标运行时”设置为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。

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

只是通过新建项目->Asp.net核心web应用程序->blazor(Asp.net核心托管)构建并发布了一个全新的项目,并将其发布到azure应用程序服务fine

因为Azure尚未直接承载.net core 3

但确实如此

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

转到扩展并单击添加[+],然后选择ASP.NET Core 3(x86用于免费托管)

同时转到“设置”、“常规”和“启用WebSocket”,默认情况下它们处于关闭状态


临时: 请注意,Preview-6不能作为扩展提供,因此请使用Preview-5或作为自包含的部署

我的答案是:

  • 将发布配置文件配置为“自包含”部署模式
  • 编辑所有.csproj文件以将
    ..
    节点名称更改为
    ..
    。(另见:)
  • 在运行时在
    Startup
    类中修复web根文件夹路径字符串,如下所示
使用Microsoft.AspNetCore.Builder;
使用Microsoft.AspNetCore.Hosting;
使用Microsoft.AspNetCore.ResponseCompression;
使用Microsoft.Extensions.DependencyInjection;
使用Microsoft.Extensions.FileProviders;
使用Microsoft.Extensions.Hosting;
使用Newtonsoft.Json.Serialization;
使用System.IO;
使用System.Linq;
命名空间BlazorHostedOnAzure.Server
{
公营创业
{
//此方法由运行时调用。请使用此方法将服务添加到容器中。
//有关如何配置应用程序的更多信息,请访问https://go.microsoft.com/fwlink/?LinkID=398940
public void配置服务(IServiceCollection服务)
{
services.AddMvc().AddNewtonsoftJson();
services.AddResponseCompression(选项=>
{
opts.MimeTypes=ResponseCompressionDefaults.MimeTypes.Concat(
新[]{“应用程序/八位字节流”});
});
}
//此方法由运行时调用。请使用此方法配置HTTP请求管道。
public void配置(IApplicationBuilder应用程序、IWebHostEnvironment环境)
{
app.UseResponseCompression();
//----附加部分。1开始----
var clientBlazorWebRootPath=默认值(字符串);
//----附加第1部分结束----
if(env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
app.UseBlazorDebugging();
}
//----附加部分。2开始----
其他的
{
if(env.WebRootPath!=null)
{
var pathOfIndex=Path.Combine(env.WebRootPath,“index.html”);
var pathOfContent=Path.Combine(env.WebRootPath,“_content”);
如果(!File.Exists(pathfindex)&&Directory.Exists(pathfcontent))
{
clientBlazorWebRootPath=Directory.GetDirectories(pathOfContent.FirstOrDefault();
if(clientBlazorWebRootPath!=null)
{
env.WebRootPath=clientBlazorWebRootPath;
}
}
}
}
//----附加第2部分结束----
app.UseClientSideBlazorFiles();
app.UseRouting();
app.UseEndpoints(端点=>
{
endpoints.MapDefaultControllerOute();
MapFallbackToClientSideBlazor(“index.html”);
});
//----附加部分。3开始----