Как развернуть приложение, размещенное на сервере Blazor, из Visual Studio 2019 - PullRequest
3 голосов
/ 11 июня 2019

Я использую VS2019 Preview. Я создал приложение Blazor на сервере, используя последнее расширение Blazor (16.0.19227). Это вариант, который содержит 3 отдельных проекта ...

  • MyApp.Client
  • MyApp.Server
  • MyApp.Shared

Я могу отладить это, сделав MyApp. Сервер активным проектом, и все работает нормально, но я изо всех сил пытаюсь опубликовать / развернуть это в Azure. Я пробовал следующее ...

  • Щелкните правой кнопкой мыши MyApp.Server в Solution-Explorer
  • Выберите «Опубликовать»
  • Пройдите через мастера, чтобы создать новый профиль публикации
  • Измените режим развертывания на «автономный»
  • Хит опубликовать

В этот момент я получаю ошибку во время развертывания ...

CSC (0,0): Ошибка CS0006: файл метаданных 'D: \ work \ Applications \ Web \ MyApp.Client \ bin \ Release \ netstandard2.0 \ win-x86 \ MyApp.Client.dll' не может быть найден

Вероятно, это связано с тем, что "Target Runtime" в профиле веб-развертывания имеет значение win-x86 . Клиентское приложение фактически строится как

"D: ​​\ работа \ Приложения \ Web \ MyApp.Client \ Bin \ Release \ netstandard2.0 \ MyApp.Client.dll"

(без дополнительной подпапки win-x86), поэтому кажется, что процесс развертывания делает неверное предположение о путях, используемых процессом сборки. В диалоговом окне публикации невозможно указать пустое / безразличное целевое время выполнения.

Есть ли обходной путь для этого или, возможно, я использую неправильный подход для развертывания?

Существует некоторая официальная документация , но это не очень полезно.

Обновление Похоже, что при развертывании используется выходной путь проекта клиента, а затем просто добавляется netstandard2.0 {Target Runtime} , поэтому изменяется выходной путь в Клиентского проекта недостаточно для обхода проблемы.

Обновление 2 Удаление тега RuntimeIdentifier в профиле публикации путем редактирования xml просто приводит к ошибке времени развертывания, утверждающей, что пустой RuntimeIdentifier несовместим с автономным развертыванием. К сожалению, автономное развертывание необходимо, поскольку Azure еще не размещает .net core 3 напрямую.

Ответы [ 3 ]

4 голосов
/ 11 июня 2019

, поскольку Azure еще не размещает .net core 3 напрямую.

Но это так.

На портале Azure перейдите в веб-приложение после развертывания (или создайте его заранее).

Перейдите в Расширения и нажмите Добавить [ + ] и выберите ASP.NET Core 3 (x86 для бесплатного хостинга).

Также перейдите в Настройки, Общие и включитеWebSockets, они по умолчанию отключены.


Temporary:

Обратите внимание, что Preview-6 недоступен в качестве расширения, поэтому используйте Preview-5 или разверните его как автономный.

2 голосов
/ 11 июня 2019

Не удалось поместить изображение в комментарии, поэтому я решил показать его здесь.Это мой текущий мастер публикации.

enter image description here

Только что сделал это с новым проектом через новый проект -> основное веб-приложение Asp.net -> Blazor (размещено ядро ​​Asp.net)Создано и опубликовано приложение Fine к Azure. Fine.

0 голосов
/ 13 июля 2019

Мой ответ:

  • Настройте профиль публикации в режим развертывания «Автономный».
  • Отредактируйте все файлы .csproj, чтобы изменить <TargetFramework>...</TargetFramework> имя узла на <TargetFrameworks>...</TargetFrameworks>. (см. также: https://stackoverflow.com/a/42855070)
  • Исправьте строку пути к корневой корневой папке во время выполнения в классе Startup, как показано ниже.
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 ----
        }
    }
}

Я опубликовал свой пример кода и прочитал README на GitHub в моем хранилище.

...