SignalR. Net Веб-приложение Core 3.1 не работает на локальном IIS - PullRequest
1 голос
/ 29 мая 2020

Попытка создать чат на основе онлайн-примера с использованием ASP. Net Core 3.1 и Angular.

Следующее отлично работает на IIS Express, но не на локальном IIS .

Сообщение об ошибке: WebSocketTransport. js: 85 Ошибка подключения WebSocket к 'ws: // localhost / MyCoreAPI / ChatHub': Ошибка во время рукопожатия WebSocket: Неожиданный код ответа: 400

Запуск :

    public void ConfigureServices(IServiceCollection services)
    { 
        services.AddSignalR();
    }
    public void Configure(IApplicationBuilder app, 
                          IWebHostEnvironment env, 
                          ApplicationDbContext context)
    {

        app.UseCors("EnableCORS");
        app.UseMiddleware<ErrorHandlingMiddleware>();
        app.UseMiddleware<TokenServiceMiddleware>();

        app.UseHttpsRedirection();
        app.UseStaticFiles();

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

        app.UseEndpoints(route =>
        {
            route.MapHub<ChatHub>("/ChatHub");
        });
        app.UseMvc(routes =>
        {
            routes.MapRoute(
                name: "default",
                template: "{controller=auth}/{action}/");

        });


        app.Run(async (c) =>
        {
            await c.Response.WriteAsync("My Core Web API");
        });
    }

ChatHub:

public class ChatHub : Hub
{
    public Task SendMessageToAll(Message message) =>
         Clients.All.SendAsync("receiveMessage", message);
}

Клиент:

export class ChatService {

  receiveMessage = new EventEmitter<Message>();  
  connectionEstablished = new EventEmitter<Boolean>();  

  private connectionIsEstablished = false;  
  private _hubConnection: HubConnection;  

  constructor() {  
    this.createConnection();  
    this.registerOnServerEvents();  
    this.startConnection();  
  }  

  async sendMessage(message: Message) {  
    console.log(message);
    await this._hubConnection.invoke('SendMessageToAll', message);  
  }  

  private createConnection() {  
    this._hubConnection = new HubConnectionBuilder()
      .configureLogging(LogLevel.Debug)  
      .withUrl('http://localhost/MyCoreAPI/ChatHub', {
        skipNegotiation:true,
        transport:HttpTransportType.WebSockets
      })  
      .build();  
  }  

  private startConnection(): void {  
    this._hubConnection  
      .start()  
      .then(() => {  
        this.connectionIsEstablished = true;  
        console.log('Hub connection started');  
        this.connectionEstablished.emit(true);  
      })  
      .catch(err => {  
        console.log('Error while establishing connection, retrying...');  
        setTimeout(function () { this.startConnection(); }, 5000);  
      });  
  }  

  private registerOnServerEvents(): void {  
    this._hubConnection.on('receiveMessage', (data: any) => {
      console.log(data);  
      this.receiveMessage.emit(data);  
    });  
  }
}


  }  

В IIS Express с использованием 'http://localhost: 59235 / ChatHub 'все работает. Когда я переключаюсь на локальный IIS с помощью «http://localhost/MyCoreAPI/ChatHub», я получаю сообщение об ошибке.

1 Ответ

4 голосов
/ 29 мая 2020

Можете ли вы проверить, включен ли протокол WebSockets в IIS.

«Включение или отключение функций Windows» -> Inte rnet Информационные службы -> World Wide Web Services -> Функции разработки приложений -> Протокол WebSocket

...