簡體   English   中英

在 AWS 上部署 blazor 服務器應用程序“錯誤:如果連接不在‘已連接’State 中,則無法發送數據。” 但適用於本地主機

[英]Deployed blazor server app on AWS “Error: Cannot send data if the connection is not in the 'Connected' State.” But works on local host

我有一個 blazor 服務器應用程序,它是使用 AWS Beanstalk 在 AWS 上部署的 .Net 5.0 應用程序。 這是一個單實例部署,所以我目前不能使用負載平衡(由於當前給我的限制)。 部署的環境平台為“IIS 10.0 running on 64bit Windows Server Core 2019/2.6.3”。 當我在 VS2019 和本地 iis 服務器上本地運行此應用程序時,該應用程序運行良好。 但是一旦部署,它會在瀏覽器控制台中引發錯誤:

 blazor.server.js:1 [2021-02-19T17:17:03.896Z] Error: Failed to start the transport 'LongPolling': Error e.log @ blazor.server.js:1 blazor.server.js:1 [2021-02-19T17:17:03.897Z] Error: Failed to start the connection: Error: Unable to connect to the server with any of the available transports. ServerSentEvents failed: Error: 'ServerSentEvents' does not support Binary. LongPolling failed: Error e.log @ blazor.server.js:1 blazor.server.js:19 [2021-02-19T17:17:03.897Z] Error: Error: Unable to connect to the server with any of the available transports. ServerSentEvents failed: Error: 'ServerSentEvents' does not support Binary. LongPolling failed: Error e.log @ blazor.server.js:19 blazor.server.js:1 Uncaught (in promise) Error: Cannot send data if the connection is not in the 'Connected' State. at e.send (blazor.server.js:1) at e.sendMessage (blazor.server.js:1) at e.sendWithProtocol (blazor.server.js:1) at blazor.server.js:1 at new Promise (<anonymous>) at e.invoke (blazor.server.js:1) at e.<anonymous> (blazor.server.js:19) at blazor.server.js:19 at Object.next (blazor.server.js:19) at blazor.server.js:19

該應用程序幾乎無法運行,例如當我按下按鈕時,它不會按照它的指示進行操作,但是如果它被迫加載另一個頁面,一些超鏈接按鈕仍然可以工作。 我使用 blazor 服務器模板啟動了 blazor 應用程序,因此我在項目基本位置等中有 _Imports.razor 等。

_host.cshtml

@page "/"
@namespace Space

@{
  Layout = null;
}

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="utf-8" />
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  <title>UI</title>
  <base href="~/" />
  <link rel="stylesheet" href="css/bootstrap/bootstrap.min.css" />
  <link href="css/site.css" rel="stylesheet" />
  <link href="_content/MatBlazor/dist/matBlazor.css" rel="stylesheet" />

  <!--Blazorise Stuff -->
  <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.0/css/bootstrap.min.css" integrity="sha384-9aIt2nRpC12Uk9gS9baDl411NQApFmC26EwAOH8WgZl5MYYxFfc+NcPb1dKGj7Sk" crossorigin="anonymous">
  <link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.12.0/css/all.css">
  <link href="_content/Blazorise/blazorise.css" rel="stylesheet" />
  <link href="_content/Blazorise.Bootstrap/blazorise.bootstrap.css" rel="stylesheet" />
</head>

<body>
  <component type="typeof(App)" render-mode="ServerPrerendered" />

  <div id="blazor-error-ui">
    <environment include="Staging,Production">
      An error has occurred. This application may no longer respond until reloaded.
    </environment>
    <environment include="Development">
      An unhandled exception has occurred. See browser dev tools for details.
    </environment>
    <a href="" class="reload">Reload</a>
    <a class="dismiss">🗙</a>
  </div>

  <script src="_framework/blazor.server.js"></script>
  <script src="_content/MatBlazor/dist/matBlazor.js"></script>

  <!-- blazorise stuff  -->
  <script src="https://code.jquery.com/jquery-3.5.1.slim.min.js" integrity="sha384-DfXdz2htPH0lsSSs5nCTpuj/zy4C+OGpamoFVy38MVBnE+IbbVYUew+OrCXaRkfj" crossorigin="anonymous"></script>
  <script src="https://cdn.jsdelivr.net/npm/popper.js@1.16.0/dist/umd/popper.min.js" integrity="sha384-Q6E9RHvbIyZFJoft+2mJbHaEWldlvI9IOYy5n3zV9zzTtmI3UksdQRVvoxMfooAo" crossorigin="anonymous"></script>
  <script src="https://stackpath.bootstrapcdn.com/bootstrap/4.5.0/js/bootstrap.min.js" integrity="sha384-OgVRvuATP1z7JjHLkuOU7Xw704+h835Lr+6QL9UvYjZE3Ipu6Tp75j7Bh/kR0JKI" crossorigin="anonymous"></script>
  <script src="_content/Blazorise/blazorise.js"></script>
  <script src="_content/Blazorise.Bootstrap/blazorise.bootstrap.js"></script>

  <!-- Workarounds -->
  <script src="~/workaround-gradient.js"></script>
</body>
</html>

啟動文件

namespace Space
{
  public class Startup
  {
    public Startup(IConfiguration configuration)
    {
      Configuration = configuration;
    }

    public IConfiguration Configuration { get; }

    // 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)
    {
      var connectionString = AwsParameterStore.GetValue(AwsParameters.AwsConnectString) ??
                             Configuration.GetConnectionString("DefaultConnection");

      services.AddDbContext<UiContext>(options =>
          options.UseSqlServer(connectionString));

      ConfigureIdentityStuff(services);

      services.AddServerSideBlazor();
      services.AddScoped<AuthenticationStateProvider, RevalidatingIdentityAuthenticationStateProvider<UiUser>>();
      services.AddDatabaseDeveloperPageExceptionFilter();
      services.AddBlazorDownloadFile();
      services.AddScoped<HttpClient>();
      services.AddBlazorise();
      services.AddBootstrapProviders();
      services.AddFontAwesomeIcons();
      services.AddSignalRCore();
    }

    private void ConfigureIdentityStuff(IServiceCollection services)
    {
      services.AddDefaultIdentity<UiUser>(options =>
       {
         options.SignIn.RequireConfirmedAccount = false;

         // Password settings.
         options.Password.RequireDigit = true;
         options.Password.RequireLowercase = true;
         options.Password.RequireNonAlphanumeric = true;
         options.Password.RequireUppercase = true;
         options.Password.RequiredLength = UserRelatedStaticConstDefaults.DefaultMinimumPasswordLength;
         options.Password.RequiredUniqueChars = 1;

         // Lockout settings.
         options.Lockout.DefaultLockoutTimeSpan = UserRelatedStaticConstDefaults.DefaultLockoutTime;
         options.Lockout.MaxFailedAccessAttempts = 5;
         options.Lockout.AllowedForNewUsers = true;

         // User settings.
         options.User.AllowedUserNameCharacters =
          "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-._@+";
         options.User.RequireUniqueEmail = true;
       })
        .AddRoles<IdentityRole>()
        .AddEntityFrameworkStores<UiContext>();

      services.ConfigureApplicationCookie(options =>
       {
         // Cookie settings
         options.Cookie.HttpOnly = true;
         options.ExpireTimeSpan = TimeSpan.FromMinutes(10);

         options.LoginPath = "/Identity/Account/Login";
         options.AccessDeniedPath = "/Identity/Account/AccessDenied";
         options.SlidingExpiration = true;
       });

      services.TryAddSingleton<IActionContextAccessor, ActionContextAccessor>();
      services.TryAddSingleton<IHttpContextAccessor, HttpContextAccessor>();
      services.AddRazorPages(options =>
      {
        options.Conventions.AuthorizeFolder("/Manage");
      });
    }

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

      if (env.IsDevelopment())
      {
        app.UseDeveloperExceptionPage();
        app.UseMigrationsEndPoint();
      }
      else
      {
        app.UseExceptionHandler("/Error");
        // 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.ApplicationServices
        .UseBootstrapProviders()
        .UseFontAwesomeIcons();

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

      app.UseEndpoints(endpoints =>
      {
        endpoints.MapControllers();
        endpoints.MapBlazorHub();
        endpoints.MapRazorPages();
        endpoints.MapFallbackToPage("/_Host");
      });    
    }
  }
}

我的 _Imports.razor

@using System.Net.Http
@using Microsoft.AspNetCore.Authorization
@using Microsoft.AspNetCore.Components.Authorization
@using Microsoft.AspNetCore.Components.Forms
@using Microsoft.AspNetCore.Components.Routing
@using Microsoft.AspNetCore.Components.Web
@using Microsoft.AspNetCore.Components.Web.Virtualization
@using Microsoft.JSInterop
@using Space
@using Space.Pages
@using Space.Shared
@using Space.Shared.DataInput
@using Space.Shared.OutputData
@using MatBlazor
@using MatBlazor.Components
@using MatBlazor.Components.MatAutocompleteList
@using ReactiveUI.Blazor
@using Blazorise
@using Blazorise.Components
@attribute [Authorize]

我完全不確定發生了什么。 我嘗試查找它,但在多個建議/答案之后我一無所獲。 有人可以幫忙嗎!

Blazor 需要 Websocket。 在 windows beanstalk 環境中,它顯然是默認禁用的。

我通過使用來自 aws 的預定義配置啟用了它們。

commands:
  InstallWebsocket:
    command: powershell.exe Install-WindowsFeature -name Web-WebSockets
  EnableWebsocket:
    command: 'C:\windows\system32\inetsrv\appcmd.exe set config "Default Web Site" -section:system.webServer/webSocket /enabled:"True" /receiveBufferLimit:"4194304" /pingInterval:"00:00:10"  /commit:apphost'

將此配置放在.ebextensions文件夾中,一切正常。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM