首页 > 解决方案 > 如何绕过 blazor wasm 路由系统并调用服务器

问题描述

我有一个 blazor wasm 托管应用程序,用户可以通过填写表格来创建帐户。创建帐户后,会向用户发送一封电子邮件,其中包含他/她必须遵循的链接以确认他/她对电子邮件地址的所有权。该链接指向我的服务器中的一个操作方法。同一台服务器托管 blazor wasm 应用程序和 API。

问题是,当用户单击该链接时,请求不会发送到服务器。相反,blazor 会拦截调用并尝试路由到页面。

我怎样才能使这项工作?如何创建指向我服务器中的操作的链接实际上在单击时将其发送到服务器?换句话说,如果可能的话,如何绕过 blazor 的路由系统?

更新:

注意: 这不是错误。这是 balzor wasm 的正常行为。如果应用托管在www.foo.com,则所有对foo.com(www.foo.com/bar例如 ) 的调用实际上都不会被调用,foo.com而是会被 blazor 拦截,并被视为应用中页面的路由。然而,这阻止了我,因为我的 API 与应用程序具有相同的基地址(应用程序目前位于 atlocalhost:5001/并且 API 位于localhost:5001/api/xyz),因此,当我单击链接时,blazor 阻止了对服务器的调用。问题是如何解决这个问题?如果不可能,我还有什么其他选择来实现这个流程?

标签: c#asp.net-coreblazor-webassemblyblazor-client-side

解决方案


所以我通过将 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");
        });

推荐阅读