代理 - 带有或不带有 MVC 的 ASP.NET

发布于 2024-10-18 12:59:16 字数 1173 浏览 2 评论 0 原文

我正在开发一个多租户应用程序,其中每个租户都可以访问 1 个或多个“子应用程序”(不同的 ASP.NET MVC 网站)。

稍后,我将为每个子应用程序提供新版本,并以:

有些租户希望访问最新版本,有些租户仍会使用旧版本。 这就是我所做的。

现在我想为他们隐藏“子域版本”。他们只会访问域:app1.domain.com 这个“内部智能代理”将有核心来知道该租户可以访问哪个版本。

有人知道我该怎么做吗?我的所有内部 url(链接、图像、JS、CSS 等)、AJAX 等都能正常工作吗? 或者向我指出一些可以帮助我的教程/博客/论坛?

非常感谢。

I'm working on one multi-tenancy application, where each tenant will have access to 1 or more "sub applications" (different ASP.NET MVC websites).

Later in time, I'll have new versions for each sub application and I will end with:

Some tenants will want to have access to the latest versions, and some will still be using old ones.
This is what I've done.

Now I would like to keep "the subdomain versions" hidden for them. They will only access the domain: app1.domain.com
This "internal smart proxy" will have the core to know which version this tenant has access.

Anyone knows how I can do this? In a way that all my internal urls (links, images, JS, css, etc...), AJAX,etc, will work correcly?
Or point me to some tutorials/blog/forums where i can find that can help me?

Thank you very much.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

心凉 2024-10-25 12:59:16

您尝试构建的本质上是一个 HTTP 代理。与大多数其他代理的区别在于实际的 URL 是在服务器端构建的。

有很多不同的方法可以做到这一点。我会选择以下选项之一:

  • 创建一个 HTTP 处理程序,在这种情况下,您可以使用此 代码项目文章作为起点。
  • 使用 ASP.NET MVC。创建一条“捕获所有”路由并通过一个操作方法对其进行管道传输。

无论哪种方式,您都必须

  • 分析 HttpContext.Current.Request 对象并构建合适的传出 URL
  • 使用 HttpWebRequest 从实际网站获取数据。请记住模仿原始请求标头以及请求内容(通常是 POST 参数)(如果适用)。
  • 从服务器输出Response Header,然后输出刚才取到的数据。

What you are trying to build is in essence an HTTP proxy. The difference to most other proxies is just that the actual URL is built on the server side.

There many different ways to do this. I'd choose one of the following:

  • Create an HTTP handler, in which case you could use this code project article as a starting point.
  • Use ASP.NET MVC. Create a "catch all" route and pipe that through one single action method.

Either way, you will have to

  • Analyze the HttpContext.Current.Request object and build a suitable outgoing URL
  • Use a HttpWebRequest to fetch the data from the actual website. Remember to mimic the original request header plus request content (usually POST parameters) if applicable.
  • Output the Response Header from the server and then output the data you just fetched.
尘曦 2024-10-25 12:59:16

应用程序请求路由 (ARR) 可能是一个可行的解决方案,如果您使用 IIS 7 或 7.5。

您将在 IIS 中定义一个额外的网站作为代理,该网站将独立于您的应用程序使用的网站。

有关哪个租户使用哪个版本的规则必须写入 web.config 以便 ARR 读取。这是可以接受的吗?如果您有少量不经常更改的租户,您可能会乐意手动编辑此文件。如果您需要更多自动化,您可以以编程方式生成此 web.config 文件。由于此 web.config 仅适用于您的 ARR 代理站点,因此编辑它不会导致您的应用程序站点重新启动。

示例配置可能使用以下 IIS 站点:

  • 代理 - 公共 IP 地址的绑定。 *.domain.com 解析为此地址
  • v1app - 绑定 127.0.0.101
  • v2app - 绑定 127.0.0.102

IIS 服务器级别设置:ARR 缓存 ->服务器代理设置->启用代理。 (如果您的应用程序需要长时间超时,请在此处设置超时。)

在“代理”站点的 web.config 中,重写以下规则:

    <rewrite>
        <rules>
            <rule name="V1 tenants" stopProcessing="true">
                <match url="(.*)" />
                <action type="Rewrite" url="http://127.0.0.101/{R:1}" />
                <conditions logicalGrouping="MatchAny">
                    <add input="{HTTP_HOST}" pattern="app1.domain.com" />
                    <add input="{HTTP_HOST}" pattern="app3.domain.com" />
                </conditions>
            </rule>
            <rule name="V2 tenants" stopProcessing="true">
                <match url="(.*)" />
                <action type="Rewrite" url="http://127.0.0.102/{R:1}" />
                <conditions logicalGrouping="MatchAny">
                    <add input="{HTTP_HOST}" pattern="app2.domain.com" />
                </conditions>
            </rule>
        </rules>
    </rewrite>

当请求传入时,它将访问您的代理站点,然后这些规则将查看主机名并重定向到适当的内部站点。

如果您的 ARR 站点与内容站点在同一台服务器上运行,您可能需要

<add name="ApplicationRequestRouting" />

从 C:\windows\system32\inetsrv\config\applicationHost.config 中删除该行,并将其添加为代理站点 Web 中的模块。配置。这将仅将 ARR 应用于您的代理站点,而不是整个服务器。

Application Request Routing (ARR) could be a workable solution if you are using IIS 7 or 7.5.

You would have an additional web site defined in IIS acting as the proxy, which would be separate to the web site(s) your application uses.

The rules about which tenant is on which version would have to be written to a web.config for ARR to read. Is this acceptable? If you have a small number of tenants changing infrequently, you may be happy to edit this file by hand. If you need more automation, you could programatically generate this web.config file. Because this web.config is only for your ARR proxy site, editing it will not cause your application sites to restart.

A sample configuration might use the following IIS Sites:

  • proxy - binding for your public IP address. *.domain.com resolves to this address
  • v1app - binding for 127.0.0.101
  • v2app - binding for 127.0.0.102

IIS server-level settings: ARR cache -> Server Proxy Settings -> enable proxy. (Set the timeout here if your app needs long timeouts.)

And in your "proxy" site's web.config, the following rewrite rules:

    <rewrite>
        <rules>
            <rule name="V1 tenants" stopProcessing="true">
                <match url="(.*)" />
                <action type="Rewrite" url="http://127.0.0.101/{R:1}" />
                <conditions logicalGrouping="MatchAny">
                    <add input="{HTTP_HOST}" pattern="app1.domain.com" />
                    <add input="{HTTP_HOST}" pattern="app3.domain.com" />
                </conditions>
            </rule>
            <rule name="V2 tenants" stopProcessing="true">
                <match url="(.*)" />
                <action type="Rewrite" url="http://127.0.0.102/{R:1}" />
                <conditions logicalGrouping="MatchAny">
                    <add input="{HTTP_HOST}" pattern="app2.domain.com" />
                </conditions>
            </rule>
        </rules>
    </rewrite>

When a request comes in, it will hit your proxy site, then those rules will look at the hostname and redirect to the appropriate internal site.

If your ARR site is running on the same server as your content sites, you may want to remove the line

<add name="ApplicationRequestRouting" />

from C:\windows\system32\inetsrv\config\applicationHost.config, and add it as a module in your proxy site's web.config. This will apply ARR only to your proxy site, instead of the whole server.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文