使用navlink时不会触发Blazor ASP.Net Core(服务器端)中的自定义URL重写规则

时间:2019-12-04 18:26:51

标签: c# blazor blazor-server-side

我在解决方案中设置了以下IRule

public class IsUrlEncodedRule : Microsoft.AspNetCore.Rewrite.IRule
{
    public void ApplyRule(RewriteContext context)
    {
        var request = context.HttpContext.Request;
        var host = request.Host;
        Console.WriteLine("Hello world!");
        context.Result = RuleResult.ContinueRules;
    }
}

然后在我的Startup.cs中,我有以下内容...

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    ...

    app.UseHttpsRedirection();
    app.UseRewriter(new RewriteOptions().Add(new IsUrlEncodedRule()));  
    app.UseStaticFiles();

    ...

    app.UseMvc();

    ...

}

最终,我希望规则检查所有URL是否已编码,但现在我只想在控制台中看到“ Hello world”,以了解其工作原理,或者完全打断规则中的断点。这是服务器端的blazor应用程序,现在唯一符合该规则的时间是您最初导航到该站点时,或者您是通过在浏览器中的导航栏中键入URL来手动导航到该站点的特定页面,以及手动导航。但是,如果您使用NavLink在站点内导航,则该规则将永远不会触发,因为客户端从未发出任何其他请求,因为所有请求均通过SignalR处理。

示例:

<NavLink class="nav-link" href="s3contents">
    <span class="fas fa-bold" aria-hidden="true"></span> S3 Contents
</NavLink>

如果您已经在网站上 ,单击此NavLink将带您到http://localhost:8080/s3contents,规则将 < / strong>被触发。到那里后,如果您手动刷新页面,或者复制URL并将其粘贴到新标签中并导航至该标签,则会触发规则 。我的问题是我如何配置服务,以使即使用户已经 导航到某个特定页面,我实现的任何IRule都将始终被触发。网站,并通过SignalR而不是传统的http请求进行导航?

1 个答案:

答案 0 :(得分:2)

接收到http请求后,URL重写将重新写入服务器中的URL。
通过SignalR导航不会发出http请求,因此您不能将URL重写用于行为。

但是,如果目标是捕获每个导航事件,请使用NavigationManager.LocationChanged。目前无法取消,并且我们无法阻止导航。但是问题是https://github.com/aspnet/AspNetCore/issues/14962