首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Razor页面应用程序中托管Blazon

如何在Razor页面应用程序中托管Blazon
EN

Stack Overflow用户
提问于 2021-02-14 20:39:36
回答 2查看 641关注 0票数 1

“标准”Blazor应用程序驻留在静态HTML页面中,例如index.html。由于某些需求,我想在Razor页面应用程序中托管Blazor。

我所做的是从一个“标准”Blazor应用程序开始,删除静态文件,因为我不需要它们,将index.html的内容移动到Wasm.cshtml,并将endpoints.MapFallbackToFile("index.html");更改为endpoints.MapFallbackToPage("/Wasm");

一切似乎都如期而至;我可以运行应用程序并导航到我在Blazor中的不同页面。

但是,当我试图使用http://mysite/counter访问页面时,事情就会分崩离析;例如,/counter是Blazor中的一个页面,我得到以下错误:

代码语言:javascript
复制
An unhandled exception occurred while processing the request.
AmbiguousMatchException: The request matched multiple endpoints. Matches:

/Wasm
/Wasm

有人能帮我找出我做错了什么吗?

P.S.:

  • 我在这里看了一些答案,但我发现的只是人们在谈论Blazor。
  • 我使用的是.NET 3.1和Bazor3.2。
  • 我想使用我的Razor页面应用程序来托管/服务Blazor WASM,而不是将它们混合在一个项目中。他们仍然有两个不同的项目。
  • 我完全意识到Blazor、WASM和Razor页面是不相关的技术。我不是想把它们整合起来。我只是试图从动态页面服务器Blazor WASM文件。如果它能让您更好地思考我正在尝试实现的目标,那么将Razor页面视为任何服务器端技术;PHP、Node或其他任何技术,然后将其应用到我试图解决的路由问题上。
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 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页面。

代码语言:javascript
复制
  endpoints.MapFallbackToPage("/wasm/{**segment}", "/_wasm");
  endpoints.MapFallbackToPage("/_Host");

以下是答案的总结:

  • 创建一个Blazor WASM项目。您可以从Blazor托管模板中复制该模板。
  • 参考Razor页面项目中的项目。
  • 创建承载Blazor的页面;例如,Wasm.cshtml,并确保没有设置页面路由;也就是说,页面顶部只有@page,因此它采用默认路由/wasm
  • 将Blazor项目中的index.html代码复制到Wasm.cshtml中。
  • 重要:如果您正在使用您自己的布局,那么在页面或布局<base href="/" />部分设置<head>是很重要的。
  • 从Blazor项目中删除所有静态文件;例如,index.html
  • 从Blazor项目中删除所有*.razor页面。
  • Wasm.razor添加到Blazor项目,并将其路由设置为/wasm;即@page "/wasm"
  • 在Razor项目中的Startup.cs中,在app.UseStaticFiles();之后添加app.UseBlazorFrameworkFiles();
  • 同样在同一个Startup.cs中,在app.UseEndpoints() lambda中添加endpoints.MapFallbackToPage("/wasm/{**segment}", "/wasm");
  • 现在运行应用程序并导航到/wasm。除了设置的布局之外,您还应该看到Wasm.razor的内容。当您粘贴URL http://whateveryoursiteis/wasm时,您将得到相同的结果。
票数 2
EN

Stack Overflow用户

发布于 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的重载,您可以在其中提供路径前缀。例如。

代码语言:javascript
复制
app.UseBlazorFrameworkFiles("/wasm");

您需要修复其他路由。

编辑:那么,让我们给出一个案例。你有:

  • 一个为页面//counter等提供服务的Blazor项目。
  • Razor项目,为页面、/weatherforecast等提供服务。

现在:

  1. 你可以在/上启动应用程序。这将从服务器加载WASM。
  2. 接下来,单击计数器图标。这不会改变页面!:它显示计数器页面并更新导航url,但是没有加载新页面。
  3. 现在去weatherforecast。这在WASM中找不到,因此实际上从服务器加载了一个新页面。(剃刀页或控制器/视图)
  4. 如果要返回到counter,则在服务器上找不到这一点,因此服务器“跌回”到根目录(/Index),并再次加载WASM。接下来看看是否在WASM中找到了counter

拥有一个动态的/Index会破坏这个系统,所以您必须手动解决所有的路由问题。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66199894

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档