切换asp.net Core Blazor托管模型

时间:2019-07-19 15:00:04

标签: blazor

我正在研究Asp.net blazor,并且找到了有关Blazor托管的文章。

https://docs.microsoft.com/en-us/aspnet/core/blazor/hosting-models?view=aspnetcore-3.0

我有兴趣了解从服务器端Blazor托管模式切换到客户端以及其他方式的困难有多大?

2 个答案:

答案 0 :(得分:3)

一点都不困难。罗宾·苏(Robin Sue)已经开始工作,我建议您查看他的Blazor Duel mode回购。这是他添加对决模式的说明。

创建一个Blazor(托管ASP.NET Core)项目,然后更改.Server项目的Startup类以启用服务器端功能。这不会对客户端Blazor产生不利影响,但会启用服务器端服务。为此,您需要在ConfigureServices中拥有services.AddServerSideBlazor();endpoints.MapBlazorHub<Client.App>("app");在“配置”中

我们现在可以提供客户端和服务器端应用程序,但是默认情况下,我们需要在客户端的DI中对HttpClient中提供的HttpClient进行polyfil。服务器端默认情况下不会注册它,因此我们会检测到该错误,然后在DI中注册一个表现类似兼容性的HttpClient

// Server Side Blazor doesn't register HttpClient by default
if (!services.Any(x => x.ServiceType == typeof(HttpClient)))
{
    // Setup HttpClient for server side in a client side compatible fashion
    services.AddScoped<HttpClient>(s =>
    {
        // Creating the URI helper needs to wait until the JS Runtime is initialized, so defer it.
        var uriHelper = s.GetRequiredService<IUriHelper>();
        return new HttpClient
        {
            BaseAddress = new Uri(uriHelper.GetBaseUri())
        };
    });
}

这时,唯一的区别是我们在浏览器中加载了哪个blazor JS文件。这可以通过提供不同的index.html(我看不到它的简单方法)或使用一小段JS来决定要加载哪个文件来实现

<script id="blazorMode"></script>
<script>
    document.getElementById("blazorMode").src = window.location.search.includes("mode=server") ? "_framework/blazor.server.js" : "_framework/blazor.webassembly.js";
</script>

这又一次由 Robin Sue 完成,他功不可没。

答案 1 :(得分:1)

如果您想从一种托管模式切换到另一种托管模式,并且您的应用程序是由Blazor模板组成的(选择的托管模式并不重要),那么这很容易。在本节中寻找如何从一种模型切换到另一种模型的答案。

但是,当您向应用程序添加功能时,事情变得更加复杂,并且交换逐渐变得越来越困难。

我个人认为应该拒绝从一种托管模式转换为另一种托管模式的想法,这意味着您必须事先确定哪种托管模式可以更好地为您提供服务,并且一旦下定决心,您就可以发展自己的应用程序,没有任何可能仅仅因为您可能会转换托管模式而施加于应用程序的约束。

更新

以下是一些示例,说明如何从一种执行方式切换到另一种执行方式甚至是不可能的情况。

假设您已决定使用客户端Blazor,并使用Jwt和Blazor框架提供的对象(例如AuthenticationStateProvider)来实现身份验证。现在,切换到服务器端Blazor可能会出现问题。在服务器上使用Jwt身份验证并将Jwt令牌发送到用户的浏览器不仅是荒唐的,而且还可能引入安全漏洞,不用说您必须更改代码,等等。

另一个示例,假设您已决定使用服务器端应用程序构建应用程序,并且正在使用组件中的服务来检索数据。一旦决定切换到客户端Blazor,这些服务就会变得无用:您无法通过浏览器(例如英国)访问位于美国的服务器。现在,您需要切换为使用HTTP Ajax调用(HttpClient),以检索服务器上的数据。也就是说,您必须重写大量代码,等等。

这是两个示例,为什么您不应该接受从一种托管模式切换到另一种托管模式的想法。这是一个坏主意,而且没有神奇的方法可以做到。我不推荐它。

新更新,请阅读答案的最后一部分。这样可以清楚地说明您可能会遇到的问题以及必须采用的代码更改等。

我想您是Blazor的新手,并且您尝试了解从一种执行方式切换到另一种执行方式的好处。我已经给您提供了一些示例,并衷心拒绝了从一种执行方式切换到另一种执行方式的想法。我想您解决此问题的最佳方法是开始学习Blazor。请问我一些具体问题,以便我进一步回答您的问题。

希望这对您有帮助...