在开发过程中,我在Blazor WebAssembly应用程序的服务器端使用了Swagger。总是使用kestrel而不是IIS Express启动(调试)。路由工作如预期,我的所有组件都正确路由,如果我手动输入/swagger,我就会进入swagger页面。一切都很好。
我们已经在我们的预生产服务器上部署了IIS,服务器端和Blazor应用程序(客户端)按预期工作并可用,然而,我的/swagger url被重写(我假设)去到我的应用程序中的某个地方,而不是让它去/swagger,显然没有任何组件响应/swagger。
我唯一的猜测是,当托管在IIS上时,aspnet核心应用程序负责告诉IIS重写什么以及如何重写(类似于可以通过web.config为“独立”部署提供的配置)。
我找不到如何指定异常,我一直在遵循https://docs.microsoft.com/en-us/aspnet/core/host-and-deploy/blazor/webassembly?view=aspnetcore-3.1#iis的文档
你知道我该怎么为/swagger添加一个例外吗?
编辑:
事实证明,它在Chrome上运行没有问题,只有Firefox有不想要的行为。如果我清除我的缓存,或者使用隐身模式,这个问题在Firefox中不会发生。所以,似乎Firefox缓存了一些东西,并试图将我的URL输入发送到Blazor Wasm,而不是通过服务器。我会用dev工具和fiddler打开调试更多,试着弄清楚,我会报告的。
发布于 2020-05-29 22:20:43
事实证明,这是发布的service-worker.js文件的一部分。它在dev中与发布的内容不同(这是有意义的)。
在我的调试过程中,我能够在所有浏览器(Edge,Chrome和Firefox)上重现这个问题,无论是否处于隐身/隐私模式。
一旦服务工作者开始运行,它就会处理来自Blazor WebAssembly应用程序的缓存/索引.html的服务请求。
如果你进入Blazor "wwwroot“文件夹,你会发现一个WebAssembly -worker.js和一个服务-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。
发布于 2020-05-29 05:08:46
您的Startup.Configure方法中是否有UseSwagger first?
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",
}));
}这对我们来说工作得很好。
https://stackoverflow.com/questions/62073764
复制相似问题