Nginx хостинг Приложение Signalr Blazor Wasm: метод 405 не разрешен - PullRequest
0 голосов
/ 20 февраля 2020

Этот запрос от приложения Blazor WebAssembly, обслуживаемого Nginx, возвращает ошибку 405 «Метод не разрешен» (POST):

http://localhost: 4000 / chatHub /gotiate ?gotiateVersion = 1

Исследование Я обнаружил, что когда Nginx работает в качестве обратного прокси-сервера, необходимо обновить заголовки, но это не мой случай. Nginx здесь работает как веб-сервер. Вот мой nginx .conf:

events {}

http {
    include mime.types;
    types {
        application/wasm wasm;
    }

    server {
        listen 80;

        location / {
            root /usr/share/nginx/html;
            try_files $uri $uri/ /index.html =404;
            add_header 'Access-Control-Allow-Origin' '*';
            add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS, PUT, DELETE, PATCH';
            add_header 'Access-Control-Allow-Headers' 'Content-Type, X-Requested-With';
            add_header 'Access-Control-Allow-Credentials' 'true';
        }
    }
}

Вот мой back-end api Конфигурация запуска:

// 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();

        services.AddCors(options =>
        {
            options.AddDefaultPolicy(builder =>
            {
                builder.AllowAnyOrigin()
                        .AllowAnyHeader()
                        .AllowAnyMethod()
                        .SetIsOriginAllowed(host => 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.UseCors();
        app.UseRouting();

        app.UseAuthorization();

        app.UseEndpoints(endpoints =>
        {
            endpoints.MapHub<ChatHub>("/chatHub");
            endpoints.MapControllers();
        });
    }

Что мне здесь не хватает? Нужно ли сопоставлять указанное c расположение "/ chatHub" в nginx .conf для какой-либо работы с webSockets?

Ps .: Я использую Docker контейнеры (docker -compose) .

Ответы [ 2 ]

0 голосов
/ 21 февраля 2020

Итак, проблема не была Nginx в конце концов. Я отправлял запрос на неправильный порт. Приложение Blazor не должно проходить через Nginx, а запрашивать непосредственно к бэкэнду.

Я использовал класс NavigationManager , чтобы получить URI для бэкэнда, но я не понимал, что по умолчанию он указывает на источник внешнего интерфейса , который дал мне неправильный URI. Я следовал учебнику , но мне пришлось внести некоторые изменения, потому что я не использую версию Blazor Wasm Asp. net.

Проблема, однако, заключается в следующем: регистрации конечных точек. Концентраторы должны быть зарегистрированы после контроллеров , иначе браузер выдаст ошибку CORS. Итак, правильно:

        app.UseEndpoints(endpoints =>
        {
            endpoints.MapControllers();
            endpoints.MapHub<ChatHub>("/chatHub");
        });
0 голосов
/ 20 февраля 2020

Попробуйте это

...

server {
    listen 80;

        location /chatHub/ {
            proxy_pass http://localhost:4000
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection "Upgrade";
        }

        location / {
            root /usr/share/nginx/html;
            try_files $uri $uri/ /index.html =404;
            add_header 'Access-Control-Allow-Origin' '*';
            add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS, PUT, DELETE, PATCH';
            add_header 'Access-Control-Allow-Headers' 'Content-Type, X-Requested-With';
            add_header 'Access-Control-Allow-Credentials' 'true';
        }
    }
}

...

На docker -compose.yml убедитесь, что вы получили

...
ports:
  - "4000:4000"
...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...