c# - 如何绕过 blazor wasm 路由系统并调用服务器
问题描述
我有一个 blazor wasm 托管应用程序,用户可以通过填写表格来创建帐户。创建帐户后,会向用户发送一封电子邮件,其中包含他/她必须遵循的链接以确认他/她对电子邮件地址的所有权。该链接指向我的服务器中的一个操作方法。同一台服务器托管 blazor wasm 应用程序和 API。
问题是,当用户单击该链接时,请求不会发送到服务器。相反,blazor 会拦截调用并尝试路由到页面。
我怎样才能使这项工作?如何创建指向我服务器中的操作的链接实际上在单击时将其发送到服务器?换句话说,如果可能的话,如何绕过 blazor 的路由系统?
更新:
- 我使用 Identity 作为后备存储(但这与我遇到的问题无关)。
- 我使用基本控制器中的 Url 属性生成链接
Url.Action("actionName", "controllerName", actionParam, Request.Scheme);
。目前,该链接看起来像https://localhost:5001/api/user/confirmaemail?confirmationtoken=xyz&useremail=abc
- 该操作是一个发布操作。
- 当 blazor 尝试重定向到该页面时,它显然不能,因为我没有具有这种路由的页面。
<NotFound />
因此会显示组件内的内容(App.razor 文件)。
注意:
这不是错误。这是 balzor wasm 的正常行为。如果应用托管在www.foo.com
,则所有对foo.com
(www.foo.com/bar
例如 ) 的调用实际上都不会被调用,foo.com
而是会被 blazor 拦截,并被视为应用中页面的路由。然而,这阻止了我,因为我的 API 与应用程序具有相同的基地址(应用程序目前位于 atlocalhost:5001/
并且 API 位于localhost:5001/api/xyz
),因此,当我单击链接时,blazor 阻止了对服务器的调用。问题是如何解决这个问题?如果不可能,我还有什么其他选择来实现这个流程?
解决方案
所以我通过将 Action 方法设置为 GET 方法而不是 POST 来解决问题。仔细想想,这很合乎逻辑:当用户点击他/她通过电子邮件收到的链接时,将发出 GET,而不是 POST。
我还了解到,仅当您在地址栏中输入地址时,blazor 才会将您路由到页面。如果您单击链接,将发出请求。我认为 blazor 拦截请求的原因是因为单击链接会将我重定向到一个页面,但实际上,它只是一种后备机制。您可以在方法中看到它configure
:
app.UseEndpoints(endpoints =>
{
endpoints.MapRazorPages();
endpoints.MapControllers();
// the link clicked issues a GET. My action is a POST.
// So no action is found. It falls back to the index.html
// which is the entery point of my app. Blazor takes over
// from here and tries to find a page for the url requested.
endpoints.MapFallbackToFile("index.html");
});
推荐阅读
- docker - 使用 SSH 登录到基于 alpine 的缓存容器
- haskell - Haskell解释器eval创建函数
- ibm-mq - 如何解决 MQJE001:完成代码“2”,原因“2085”
- python - 如何在 crepe 模块中使用 --step-size 选项?
- python - 如何让 python 乌龟在折线图中绘制 collatz 序列的输出?
- amazon-s3 - 如何使用 S3 防止重复密钥?
- bash - bash - 通过日志文件中的多个“任务”计数、处理和递增
- r - 闪亮的应用程序下载按钮仅以 HTML 响应
- python - 如何在 pandas 中一次 .apply 或 .replace 多个列?
- rust - Rust 中的二进制文件和库有什么区别?