可以使用哪些架构来分解单一的 ASP.NET 网站?

What architectures may be used to break up a monolithic ASP.NET website?

我想将一个单一的 ASP.NET MVC 网站分成多个可以独立开发的网站,但保留一个通用的 public URL 和相关的 SSL 证书 - 这是一个单个主机证书,而不是通配符。

public 网站匿名用户的主要 URL 将保持不变,并将成为标准 ASP.NET MVC 网站,尽管用于此的技术将升级时间.

至于其他服务,可能有很多这样的服务,它们可能 运行 在云中,在 Raspberry Pi 或其他地方。许多响应流将作为 text/html 返回,尽管 JSON 也会从某些 API 返回。

出于安全考虑,我计划使用 IdentityServer 作为安全令牌服务 (STS)(稳定后可能是版本 4),因此需要考虑这一点 - 尤其是身份验证 cookie 处理。

我什至不知道如何称呼这个前端 'distributor',但我假设它是轻量级的。我看过一个节点服务器的快速演示,用于此角色的简单版本,但我对节点的了解还不够,无法了解此策略的局限性。

我更喜欢 C# ASP.NET MVC 解决方案,因为我熟悉该技术。

您的前端应用程序可以是一个简单的反向代理。

我写了一篇 blog post 关于使用 Azure Web 应用程序创建免费反向代理的文章。您实际上可以免费执行此操作,至少在您测试一切都按预期工作时是这样。

您可以使用 IIS URL rewriting and Application Request Routing.

你还想重写出路的内容,这样任何对http://somehost.azurewebsites.net的引用都被重写为http://www.example.com/app1,等等

这是一个例子web.config:

<?xml version="1.0" encoding="utf-8"?>  
<configuration>  
    <system.webServer>
        <rewrite>
            <rules>
                <rule name="Proxy" stopProcessing="true">
                    <match url="example.com/(app1)/(.*)" />
                    <action type="Rewrite" url="http://somehost.azurewebsites.net/{R:2}" />
                    <serverVariables>
                        <set name="HTTP_X_UNPROXIED_URL" value="{R:0}" /> 
                        <set name="HTTP_X_ORIGINAL_ACCEPT_ENCODING" value="{HTTP_ACCEPT_ENCODING}" /> 
                        <set name="HTTP_X_ORIGINAL_HOST" value="{HTTP_HOST}/{R:1}" />
                        <set name="HTTP_ACCEPT_ENCODING" value="" />
                    </serverVariables>
                </rule>
            </rules>
            <outboundRules>
                <rule name="ChangeReferencesToOriginalUrl" patternSyntax="ExactMatch" preCondition="CheckContentType">
                       <match filterByTags="None" pattern="http://example.com/app1" />
                       <action type="Rewrite" value="http://{HTTP_X_ORIGINAL_HOST}" />
                  </rule>
                <preConditions>
                    <preCondition name="CheckContentType">
                        <add input="{RESPONSE_CONTENT_TYPE}" pattern="^(text/html|text/plain|text/xml|application/rss\+xml)" />
                    </preCondition>
                </preConditions>
            </outboundRules>
        </rewrite>
    </system.webServer>
</configuration> 

请注意,通过规则 example.com/(app1)/(.*) 处理 http://www.example.com/app1/path/and/query?qs=1 意味着会发生这种情况:

{R:0} 包含 http://www.example.com/app1/path/and/query?qs=1

{R:1} 包含 app1

{R:2} 包含 path/and/query?qs=1