“标准”Blazor应用程序驻留在静态HTML页面中,例如index.html。由于某些需求,我想在Razor页面应用程序中托管Blazor。
我所做的是从一个“标准”Blazor应用程序开始,删除静态文件,因为我不需要它们,将index.html的内容移动到Wasm.cshtml,并将endpoints.MapFallbackToFile("index.html");更改为endpoints.MapFallbackToPage("/Wasm");。
一切似乎都如期而至;我可以运行应用程序并导航到我在Blazor中的不同页面。
但是,当我试图使用http://mysite/counter访问页面时,事情就会分崩离析;例如,/counter是Blazor中的一个页面,我得到以下错误:
An unhandled exception occurred while processing the request.
AmbiguousMatchException: The request matched multiple endpoints. Matches:
/Wasm
/Wasm有人能帮我找出我做错了什么吗?
P.S.:
发布于 2021-02-16 12:45:33
好的,基于您到目前为止所写的内容,请看一下ShaunCurtis/Blazor Github的实验。这是一些实验代码的临时回购。忽略BlazorTest。启动项目是巴兹尔-实验。
默认页面是普通剃须刀页面。这是一个混合Razor,和Blazor站点。所有的WASM路由看起来都像wasm/fetchdata,所以对于所有的服务器和WASM“页面”,我们都有不同的URL。
启动时会使用多个端点来区分URL,因此任何位于Blazor应用程序“作用域”中的URL都会被设置为_wasm.cshtml。任何其他不能直接映射的内容都在_host.cshtml的Blazor应用程序的“作用域”中。网站上的所有计划Razor页面都按原样提供服务。您根本不需要Blazor比特,只需回退到默认的Razor页面。
endpoints.MapFallbackToPage("/wasm/{**segment}", "/_wasm");
endpoints.MapFallbackToPage("/_Host");以下是答案的总结:
Wasm.cshtml,并确保没有设置页面路由;也就是说,页面顶部只有@page,因此它采用默认路由/wasm。index.html代码复制到Wasm.cshtml中。<base href="/" />部分设置<head>是很重要的。index.html。*.razor页面。Wasm.razor添加到Blazor项目,并将其路由设置为/wasm;即@page "/wasm"。Startup.cs中,在app.UseStaticFiles();之后添加app.UseBlazorFrameworkFiles();。Startup.cs中,在app.UseEndpoints() lambda中添加endpoints.MapFallbackToPage("/wasm/{**segment}", "/wasm");。/wasm。除了设置的布局之外,您还应该看到Wasm.razor的内容。当您粘贴URL http://whateveryoursiteis/wasm时,您将得到相同的结果。发布于 2021-02-15 10:11:53
你提供的信息很少,所以我得做一些猜测。
我想您的WASM集成是基于Blazor ASP.NET托管模板的。该模板由三个项目组成:.Client项目、.Server项目和一些具有共享模型的额外项目(它们可能在执行干净的体系结构)。服务器项目是Razor pages项目,客户端是WASM项目。
您必须理解的是,Blazor WASM项目与Razor pages应用程序是不可比拟的。Blazor,或者实际上任何WASM文件都是一种不同类型的二进制文件,并且是完全在客户机上运行!它是一个客户端应用程序。也就是说,输出二进制完全不同。您不能有一个同时生成服务器(x86/arm)二进制和客户机(WASM)二进制的项目。你需要两个独立的项目。
在编译WASM项目时,实际发生的情况是,所有页面路由也被转换为WASM。更改页面时,只需检查网络流量即可。即使你浏览网址变了,那也是假的.没有网络流量!事实上,你们保持一致。
现在,想想当您在浏览器中手动输入“./计数器”时会发生什么。主机实际上将再次从根下载相同的.wasm文件("/“= "/Index"),然后解析路由客户端。
回到你的问题上。出于某种原因,您将所有内容从Blazer WASM项目wwwroot/index.html复制到Razor项目Pages/Index.cshtml。现在你把整个路由系统搞混了。当您键入“./计数器”时,WASM路由器将告诉您.wasm文件需要从"/Index“下载。同时,Razor路由器将告诉您编译后的Index.cshtml在"/Index“中可用。这将给您的"AmbiguousMatchException:请求匹配多个端点。匹配: /Index /Index“。
看一下UseBlazorFrameworkFiles的总结
将应用程序配置为从根路径"/“为WebAssembly框架文件提供服务。
解决方案只是将index.html保留在WASM项目中。只需看看默认的Blazor ASP.Net应用程序:它同时拥有Blazor、Razor和MVC,路由也很好。
另一种解决方案是使用UseBlazorFrameworkFiles的重载,您可以在其中提供路径前缀。例如。
app.UseBlazorFrameworkFiles("/wasm");您需要修复其他路由。
编辑:那么,让我们给出一个案例。你有:
/、/counter等提供服务的Blazor项目。/weatherforecast等提供服务。现在:
/上启动应用程序。这将从服务器加载WASM。weatherforecast。这在WASM中找不到,因此实际上从服务器加载了一个新页面。(剃刀页或控制器/视图)counter,则在服务器上找不到这一点,因此服务器“跌回”到根目录(/Index),并再次加载WASM。接下来看看是否在WASM中找到了counter。拥有一个动态的/Index会破坏这个系统,所以您必须手动解决所有的路由问题。
https://stackoverflow.com/questions/66199894
复制相似问题