可以使用哪些架构来分解单一的 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
我想将一个单一的 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