안녕하세요.
작은 회사에서 전산사이트를 blazor 로 개발해서 사용하고 있습니다.
회사에서만 사용해서 제 pc가 개발도 하고 배포 서버로도 사용하고 있는데요,
iis로 호스팅하고 있습니다!
그런데 사이트를 2대이상 즉 3대 컴퓨터에서 접속하면 접속이 끊기는 현상이 일어납니다 ㅜㅜ 예를 들어서 a 컴퓨터, b컴퓨터에서 접속하면 잘됩니다. 그런데 c컴퓨터에서 접속하면 c 컴퓨터에서 사이트가 메인화면만 접속이되고 메뉴버튼이나 이런것들이 안되더라구요. 그러다가 b 나 a 컴퓨터에서 사이트를 닫으면 c컴퓨터에서는 또 잘돌아갑니다…
c컴퓨터에서 접속이 안될때 개발자 모드에서 console 에러 내용입니다.
2024-03-26T23:15:47.197Z] Information: Normalizing ‘_blazor’ to ‘https://172.30.1.56/_blazor’.
blazor.server.js:1 Uncaught Error: Blazor has already started.
at Object.Br [as start] (blazor.server.js:1:151358)
at (index):429:16
blazor.server.js:1 [2024-03-26T23:16:02.204Z] Error: Connection disconnected with error ‘Error: Server returned handshake error: Handshake was canceled.’.
log @ blazor.server.js:1
blazor.server.js:1 [2024-03-26T23:16:02.205Z] Error: Error: Server returned handshake error: Handshake was canceled.
log @ blazor.server.js:1
blazor.server.js:1 [2024-03-26T23:16:02.205Z] Warning: Failed to connect via WebSockets, using the Long Polling fallback transport. This may be due to a VPN or proxy blocking the connection. To troubleshoot this, visit Host and deploy ASP.NET Core server-side Blazor apps | Microsoft Learn.
log @ blazor.server.js:1
blazor.server.js:1 [2024-03-26T23:16:02.205Z] Error: Failed to start the circuit.
이렇게 에러가 나구요…
웹소켓… 허브 이런것들은 아직 깊게 몰라서 사이트보면서
Program.cs 에 추가 하거나 했고…
using Microsoft.AspNetCore.Authentication.Certificate;
using Microsoft.AspNetCore.Components;
using Microsoft.AspNetCore.Components.Web;
using Microsoft.EntityFrameworkCore;
using Radzen;
using RarareteApp.Data;
using RarareteApp.Data.Model;
using RarareteApp.Services;
using RarareteApp.Services.FrService;
using RarareteApp.Services.ItemService;
using RarareteApp.Services.OrderService;
using System.Net.WebSockets;
using System.Security.Claims;
var builder = WebApplication.CreateBuilder(args);
var connectionString = builder.Configuration.GetConnectionString("Default") ?? throw new NullReferenceException("no connction string in config!");
//RarareteApp.Services.HostBuilder.CreateHostBuilder(args);
// Add services to the container.
builder.Services.AddRazorPages();
builder.Services.AddServerSideBlazor();
builder.Services.AddSingleton<WeatherForecastService>();
builder.Services.AddTransient<CustomerService>();
builder.Services.AddTransient<KakaoOrderService>();
builder.Services.AddTransient<CommonService>();
builder.Services.AddTransient<OpenMarketOrderService>(); // 오픈마켓 발주서
builder.Services.AddTransient<DaliyStatusService>();
builder.Services.AddTransient<UtilityService>();
builder.Services.AddTransient<ItemService>();
builder.Services.AddTransient<SinOfflineService>();
builder.Services.AddTransient<ExcelService>();
builder.Services.AddTransient<BOMService>();
builder.Services.AddTransient<OrderService>();
builder.Services.AddTransient<SinOfflineSaleService>(); // 오프라인 판매서비스
builder.Services.AddTransient<RahanService>(); // 라한 호텔
builder.Services.AddTransient<FrService>(); // 원물규격 관련 서비스
builder.Services.AddTransient<PriceService>(); // 원물규격 관련 서비스
builder.Services.AddScoped<DialogService>(); // Radzen
builder.Services.AddScoped<NotificationService>(); //Radzen
builder.Services.AddRadzenComponents(); //Radzen
;
builder.Services.AddDbContextFactory<DemoDbContext>((DbContextOptionsBuilder options) =>
options.UseSqlServer(connectionString));
builder.Services.AddHsts(options =>
{
options.Preload = true;
options.IncludeSubDomains = true;
options.MaxAge = TimeSpan.FromDays(60);
});
builder.Services.AddHttpsRedirection(options =>
{
options.RedirectStatusCode = 307;
options.HttpsPort = 5001;
});
/*builder.Services.AddAuthentication(
CertificateAuthenticationDefaults.AuthenticationScheme).AddCertificate();*/
builder.Services.AddAuthentication(
CertificateAuthenticationDefaults.AuthenticationScheme)
.AddCertificate(options =>
{
options.Events = new CertificateAuthenticationEvents
{
OnCertificateValidated = context =>
{
var claims = new[]
{
new Claim(
ClaimTypes.NameIdentifier,
context.ClientCertificate.Subject,
ClaimValueTypes.String,
context.Options.ClaimsIssuer),
new Claim(
ClaimTypes.Name,
context.ClientCertificate.Subject,
ClaimValueTypes.String,
context.Options.ClaimsIssuer)
};
context.Principal = new ClaimsPrincipal(
new ClaimsIdentity(claims,
context.Scheme.Name));
context.Success();
return Task.CompletedTask;
}
};
});
var app = builder.Build();
// <snippet_UseWebSockets>
var webSocketOptions = new WebSocketOptions
{
KeepAliveInterval = TimeSpan.FromMinutes(2)
};
webSocketOptions.AllowedOrigins.Add("https://172.30.1.56/");
app.UseWebSockets(webSocketOptions);
// </snippet_UseWebSockets>
// Configure the HTTP request pipeline.
if (!app.Environment.IsDevelopment())
{
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.Use(async (context, next) =>
{
if (context.Request.Path == "/wss")
{
if (context.WebSockets.IsWebSocketRequest)
{
using var webSocket = await context.WebSockets.AcceptWebSocketAsync();
await RarareteApp.Controllers.WebSocketController.Echo(webSocket);
}
else
{
context.Response.StatusCode = StatusCodes.Status400BadRequest;
}
}
else
{
await next(context);
}
});
app.UseAuthentication();
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.MapBlazorHub();
app.MapFallbackToPage("/_Host");
app.Run();
이걸로도 해결되지 않아서 iis 에서 사이트 접속자 제한 설정을 10 으로 해도 해결이 안되네요 ㅜ.ㅜ 혹시 이런현상에 관해 알고계신분있으실까요?