Локально все работает нормально. Я могу подключиться к концентратору и также получать уведомления.
Когда я публикую sh API для IIS (удаленный сервер), я больше не могу подключиться к концентратору с локального компьютера.
Система. Net .Http.HttpRequestException: Не удалось установить соединение SSL, см. Внутреннее исключение. ---> System.Security.Authentication.AuthenticationException: удаленный сертификат является недействительным в соответствии с процедурой проверки. в System. Net .Security.SslStream.StartSendAuthResetSignal (сообщение ProtocolToken, AsyncProtocolRequest asyncRequest, исключение ExceptionDispatchInfo) в System. SslStream.StartSendBlob (Byte [], входящий, счетчик Int32, AsyncProtocolRequest asyncRequest) в System. Net .Security.SslStream.ProcessReceivedBlob (буфер Byte [], число Int32, AsyncProtocolRequest asyncRequest * .Sec .Sec .Sec .Sec. 10 .Sec .Sec. 10. StartReadFrame (буфер Byte [], readBytes Int32, asyncProtocolRequest asyncRequest) в System. Net .Security.SslStream.StartReceiveBlob (буфер Byte [], asyncProtocolRequest asyncRequest) в System. Net. AsyncProtocolRequest asyncRequest) в System. Net .Security.SslStream.StartSendBlob (Byte [] входящий, число Int32, AsyncProtocolRequest asyncRequest) в System. Net .Securit y.SslStream.ProcessReceivedBlob (буфер Byte [], число Int32, AsyncProtocolRequest asyncRequest) в System. Net .Security.SslStream.StartReadFrame (буфер Byte [], int32 readBytes, AsyncProtocolRequest asyncReecest * .6767). SslStream.PartialFrameCallback (AsyncProtocolRequest asyncRequest) --- Конец трассировки стека из предыдущего расположения, где было сгенерировано исключение --- в System. Net .Security.SslStream.ThrowIfExceptional () в System. Net .Security.SslStream.InternalEndProcess (LazyAsyncResult lazyResult) в System. Net .Security.SslStream.EndProcessAuthentication (результат IAsyncResult) в System. Net .Security.SslStream.EndAuthenticateAsClient (IAsyncResult asynSt. 1073 * .b__65_1 (iar IAsyncResult) в System.Threading.Tasks.TaskFactory 1.FromAsyncCoreLogic(IAsyncResult iar, Func
2 endFunction, обещание Action 1 endAction, Task
1, Boolean требуетSynchronization) --- Конец трассировки стека из предыдущего местоположения, в котором было сгенерировано исключение --- в система. Net .Http.ConnectHelpe r.EstablishSslConnectionAsyncCore (Поток потока, SslClientAuthenticationOptions sslOptions, CancellationToken cancellationToken) --- Конец внутренней трассировки стека исключений --- в System. Net .Http.HttpConnectionPool.ConnectAsyn c (запрос HttpRequestMessage, логическое значение allowHttp2, CancellationToken cancellationToken) в системе. Net .Http.HttpConnectionPool.CreateHestp11ConnectionHokenTokenToken (запрос на отмену ответа) .Http.HttpConnectionPool.GetHttpConnectionAsyn c (запрос HttpRequestMessage, CancellationToken cancellationToken) в System. Net .Http.HttpConnectionPool.SendWithRetryAsyn c (запрос на отмену возврата, запрос на возврат. RedirectHandler.SendAsyn c (запрос HttpRequestMessage, CancellationTo ken cancellationToken) в System. Net .http. DiagnosticsHandler.SendAsyn c (запрос HttpRequestMessage, CancellationToken cancellationToken) в Microsoft.AspNetCore.Http.Connections.Client.Internal.AccessTokenHttpMessageHandler.SendAsyn c запрос на отмену возврата. Internal.LoggingHttpMessageHandler.SendAsyn c (запрос HttpRequestMessage, CancellationToken cancellationToken) в System. Net .Http.HttpClient.FinishSendAsyncUnbuffered (Task`1 sendTask, HttpReceSecenceSecenceSecanceSecest .Client.HttpConnection.NegotiateAsyn c (URL-адрес Uri, HttpClient httpClient, регистратор ILogger, CancellationToken cancellationToken) Microsoft.AspNetCore.Http.Connections.Client.HttpConnection: Отладка: Пропуск * 10 * удален, подключение 10 уже отключено.
Я прошел много уроков, но безуспешно. Я видел некоторые закрытые проблемы на GitHub об этой проблеме для предыдущих версий netcore, но сначала я хочу убедиться, что мой код и концепция в порядке, прежде чем публиковать там проблему.
Ниже приведен код моего приложения.
Startup.cs
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.
public void ConfigureServices(IServiceCollection services)
{
services.AddControllers();
services.AddSignalR(hubOptions => { hubOptions.EnableDetailedErrors = true; });
}
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
app.UseHttpsRedirection();
app.UseRouting();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
endpoints.MapHub<SyncHub>("/signalr");
});
}
}
SyncHub.cs
public class SyncHub : Hub
{
public override Task OnConnectedAsync()
{
Clients.Caller.SendAsync("Connected", Context.ConnectionId);
return base.OnConnectedAsync();
}
}
WebHookController.cs
// POST: /webhook
[HttpPost]
public async Task<IActionResult> Post([FromBody] JsonElement body)
{
try
{
var eventType = body.GetProperty("eventType").ToString();
_logger.LogInformation($"[HttpPost]: The current event type is '{eventType}'");
switch (eventType)
{
case "build.complete":
await _hubContext.Clients.All.SendAsync("ReceiveMessage", $"Hi from WebHook");
_logger.LogInformation("[BuildComplete]: Build succeeded. Clients were notified.");
return Ok();
default:
return BadRequest();
}
}
catch (Exception ex)
{
_logger.LogError($"[HttpPost] Exception: {ex}");
return BadRequest();
}
}
Приложение WPF
var connection = new HubConnectionBuilder()
.WithUrl(viewModel.Endpoint)
.ConfigureLogging(logging => {
// Log to the Output Window
logging.AddDebug();
// This will set ALL logging to Debug level
logging.SetMinimumLevel(LogLevel.Debug);
})
.Build();
connection.On<string>("ReceiveMessage", (message) =>
{
Dispatcher.CurrentDispatcher.Invoke(() =>
{
using (var db = new SettingsDbContext())
{
// TODO: Do stuff
}
});
});
connection.On<string>("Connected", (connectionId) => { viewModel.ConnectionState = "Connected"; });
try
{
connection.StartAsync();
}
catch (Exception ex)
{
Debugger.Break();
// TODO: Handle error
}
Program.cs
public class Program
{
public static void Main(string[] args)
{
CreateHostBuilder(args).Build().Run();
}
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder
.ConfigureLogging(logging =>
{
logging.ClearProviders();
logging.AddConsole();
})
.UseContentRoot(Directory.GetCurrentDirectory())
.UseIISIntegration()
.UseStartup<Startup>();
});
}