Исключения перезаписи URL для развертывания Blazor WebAssembly Hosted - PullRequest
0 голосов
/ 28 мая 2020

Во время разработки я использовал Swagger на стороне сервера моего приложения Blazor WebAssembly. Всегда запускать (отлаживать) с использованием пустельги вместо IIS Express. Маршрутизация работала, как ожидалось, все мои компоненты были маршрутизированы правильно, и если я вручную набрал / swagger, я попал на страницу swagger. Все хорошо.

Мы развернули под IIS на наших предварительных серверах, серверная часть и приложение Blazor WebAssembly (клиент) работают должным образом и могут использоваться, однако мой URL-адрес / swagger будет переписан (я предполагаю) на go где-нибудь в моем приложении вместо того, чтобы разрешить go Swagger, очевидно, что нет ни одного компонента, который отвечает на / swagger.

Я могу только предположить, что при размещении на IIS основное приложение as pnet заботится о том, чтобы сообщать IIS, что и как перезаписывать (аналогично конфигурациям, которые могут быть предоставлены через web.config для «Автономное» развертывание.)

Я не могу найти, как указать исключения, я следовал do c at https://docs.microsoft.com/en-us/aspnet/core/host-and-deploy/blazor/webassembly?view=aspnetcore-3.1#iis

Любая идея как я могу добавить исключение для / swagger?

EDIT:

Оказывается, он работает без проблем в Chrome, только Firefox имеет нежелательное поведение. Если я очищаю кеш или использую режим инкогнито, проблема не возникает в Firefox. Итак, похоже, что Firefox кое-что кэширует и пытается отправить мой ввод URL-адреса в Blazor Wasm вместо того, чтобы идти на сервер. Я еще немного отлажу с инструментами разработчика и открытым скрипачом, чтобы попытаться разобраться в этом, и сообщу.

Ответы [ 2 ]

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

Оказывается, это часть опубликованного файла service-worker. js. В разработке он отличается от того, что публикуется (что имеет смысл).

Во время отладки мне удалось воспроизвести проблему во всех браузерах (Edge, Chrome и Firefox), независимо от того, в какой Инкогнито / Приватный режим или нет.

После запуска сервис-воркер обрабатывает запросы на обслуживание из кеша / индекса. html приложения Blazor WebAssembly.

Если вы go в своей папке Blazor WebAssembly Client «wwwroot», вы найдете service-worker. js и service-worker.published. js. В service-worker.published. js вы найдете функцию, которая выглядит следующим образом:

async function onFetch(event) {
    let cachedResponse = null;
    if (event.request.method === 'GET') {
        // For all navigation requests, try to serve index.html from cache
        // If you need some URLs to be server-rendered, edit the following check to exclude those URLs
        const shouldServeIndexHtml = event.request.mode === 'navigate'
            && !event.request.url.includes('/connect/')
            && !event.request.url.includes('/Identity/');

        const request = shouldServeIndexHtml ? 'index.html' : event.request;
        const cache = await caches.open(cacheName);
        cachedResponse = await cache.match(request);
    }

    return cachedResponse || fetch(event.request);
}

Простое следование инструкциям, содержащимся в комментариях к коду, поможет решить проблему. В итоге мы добавили исключение для «/ swagger», например:

&& !event.request.url.includes('/swagger')

Надеюсь, этот пост будет полезен для людей, которые захотят обслуживать вещи вне сервис-воркера, а не только Swagger.

1 голос
/ 29 мая 2020

У вас сначала используется UseSwagger в вашем методе Startup.Configure?

public static void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    app.UseSwagger();
    app.UseSwaggerUI(c =>
        c.SwaggerEndpoint("/swagger/v1/swagger.json", "YourAppName V1")
    );

В Startup.ConfigureServices у меня последний код Swagger.

public void ConfigureServices(IServiceCollection services)
{
    services.AddMvc();
    services.AddSwaggerGen(c =>
        c.SwaggerDoc(
            name: "v1",
            info: new OpenApiInfo
            {
                Title = "YourAppName",
                Version = "V1",
            }));
}

Это отлично работает для us.

Примечание: необходимо перейти к https://yourdomain/swagger/index.html

...