Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net core Blazor WebAssembly托管部署的URL重写异常_Asp.net Core_Iis_Blazor_Webassembly - Fatal编程技术网

Asp.net core Blazor WebAssembly托管部署的URL重写异常

Asp.net core Blazor WebAssembly托管部署的URL重写异常,asp.net-core,iis,blazor,webassembly,Asp.net Core,Iis,Blazor,Webassembly,在开发过程中,我在Blazor WebAssembly应用程序的服务器端使用了Swagger。始终使用kestrel而不是IIS Express启动调试。 路由按预期工作,我的所有组件路由正确,如果我手动键入/swagger,我会进入swagger页面。一切都好 我们已经在我们的pre-prod服务器上的IIS下进行了部署,服务器端和Blazor WebAssembly应用程序客户端按预期工作,并且可用,但是,我的/swagger url被重写了。我假设我的应用程序中的某个地方会有/swagge

在开发过程中,我在Blazor WebAssembly应用程序的服务器端使用了Swagger。始终使用kestrel而不是IIS Express启动调试。 路由按预期工作,我的所有组件路由正确,如果我手动键入/swagger,我会进入swagger页面。一切都好

我们已经在我们的pre-prod服务器上的IIS下进行了部署,服务器端和Blazor WebAssembly应用程序客户端按预期工作,并且可用,但是,我的/swagger url被重写了。我假设我的应用程序中的某个地方会有/swagger url,而不是让它转到swagger,显然没有任何组件响应/swagger

我唯一的猜测是,当托管在IIS上时,aspnet core应用程序负责告诉IIS要重写什么,以及与通过web.config为独立部署提供的配置有多相似

我找不到如何指定异常,我一直在跟踪

你知道我该如何为/swagger添加一个例外吗

编辑:


事实证明,它在Chrome中没有问题,只有Firefox有不想要的行为。如果我清除缓存,或使用匿名模式,Firefox中不会出现此问题。因此,Firefox似乎缓存了一些东西,并试图将我的URL输入发送到Blazor Wasm,而不是发送到服务器。我将在开发工具和fiddler打开的情况下进行更多的调试,以尝试解决问题,并向您报告。

您是否在启动时首先使用了UseSwagger。配置方法

在Startup.ConfigureServices中,我最后得到了招摇过市代码

public void ConfigureServices(IServiceCollection services)
{
    services.AddMvc();
    services.AddSwaggerGen(c =>
        c.SwaggerDoc(
            name: "v1",
            info: new OpenApiInfo
            {
                Title = "YourAppName",
                Version = "V1",
            }));
}
这对我们来说很好


注意:您必须导航到

启动时是否首先使用了UseSwagger。配置方法

在Startup.ConfigureServices中,我最后得到了招摇过市代码

public void ConfigureServices(IServiceCollection services)
{
    services.AddMvc();
    services.AddSwaggerGen(c =>
        c.SwaggerDoc(
            name: "v1",
            info: new OpenApiInfo
            {
                Title = "YourAppName",
                Version = "V1",
            }));
}
这对我们来说很好


注意:您必须导航到

这是发布的service-worker.js文件的一部分。在dev中,它与发布的内容不同,这是有意义的

在调试过程中,我能够在所有浏览器Edge、Chrome和Firefox上重现这个问题,无论是否处于匿名/私有模式

一旦服务工作者运行,它将处理Blazor WebAssembly应用程序的cache/index.html中的服务请求

如果您进入Blazor WebAssembly客户端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);
}
只要遵循代码注释中的说明就可以解决问题。因此,我们最终添加了一个排除项,例如:

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

希望这篇文章对那些想在服务人员之外提供服务的人有用,而不仅仅是大摇大摆。

原来这是发布的service-worker.js文件的一部分。在dev中,它与发布的内容不同,这是有意义的

在调试过程中,我能够在所有浏览器Edge、Chrome和Firefox上重现这个问题,无论是否处于匿名/私有模式

一旦服务工作者运行,它将处理Blazor WebAssembly应用程序的cache/index.html中的服务请求

如果您进入Blazor WebAssembly客户端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);
}
只要遵循代码注释中的说明就可以解决问题。因此,我们最终添加了一个排除项,例如:

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

希望这篇文章对那些想在服务人员之外服务的人有用,而不仅仅是大摇大摆。

当然可以。当我直接从Kestrel dotnet MyDll.server.dll运行我的应用程序时,Swagger起作用,但当我托管在IIS上时,它不起作用,因为它试图在我的Blazor应用程序中路由/Swagger,寻找响应/Swagger而不是直接进入Swagger页面的组件。这就是为什么我要谈论URL重写,这是目前对我唯一合乎逻辑的解释。我导航到mydomain/swagger no index.html,但如果我添加index.html,也会发生同样的情况。今天早上发生了一件有趣的事,我去了mydomain/Swigger,Swigger出现了!之后,在Firefox的同一个标签上,我删除了/swagger,访问了我的Blazor wasm站点,然后重新键入/swagger,但无法访问swagger,我留在Blazor wasm中,抱歉,这里什么都没有。消息我在Chrome中尝试了同样的方法,它在Chrome中的效果与预期一样。。。因此,我认为aspnet核心/blazor/rewrite方面还可以,这可能是Firefox的一个“bug”。发布了我问题的答案,其中详细说明了如何指定重写/服务的异常。我是Currior tho,Peter,你真的有Blazor WebAssembly托管的部署吗?也就是说,服务器和客户端托管在同一个IIS站点上,在IIS上运行,并为swag服务
在运行WebAssembly应用程序及其服务人员后,ger是否没有问题?我的意思是,它被记录在service-worker.published.js中,这告诉我,一旦serviceworker运行,使用/swagger是不可能的。最后一点:是我将/index.html添加到招摇过市路径的关键,当然是。当我直接从Kestrel dotnet MyDll.server.dll运行我的应用程序时,Swagger起作用,但当我托管在IIS上时,它不起作用,因为它试图在我的Blazor应用程序中路由/Swagger,寻找响应/Swagger而不是直接进入Swagger页面的组件。这就是为什么我要谈论URL重写,这是目前对我唯一合乎逻辑的解释。我导航到mydomain/swagger no index.html,但如果我添加index.html,也会发生同样的情况。今天早上发生了一件有趣的事,我去了mydomain/Swigger,Swigger出现了!之后,在Firefox的同一个标签上,我删除了/swagger,访问了我的Blazor wasm站点,然后重新键入/swagger,但无法访问swagger,我留在Blazor wasm中,抱歉,这里什么都没有。消息我在Chrome中尝试了同样的方法,它在Chrome中的效果与预期一样。。。因此,我认为aspnet核心/blazor/rewrite方面还可以,这可能是Firefox的一个“bug”。发布了我问题的答案,其中详细说明了如何指定重写/服务的异常。我是Currior tho,Peter,在运行WebAssembly应用程序及其服务人员后,您是否真的有Blazor WebAssembly托管的部署,即服务器和客户端托管在同一个IIS站点上,在IIS上运行,并为swagger提供无问题服务?我的意思是,它被记录在service-worker.published.js中,这告诉我,一旦serviceworker运行,使用/swagger是不可能的。最后一点:是我将/index.html添加到swagger pathPerfect的关键。10票,太好了。10票以上。