在两台物理服务器中托管 ASP.NET MVC 项目
Posted
技术标签:
【中文标题】在两台物理服务器中托管 ASP.NET MVC 项目【英文标题】:Host ASP.NET MVC project in two physical servers 【发布时间】:2015-12-08 09:34:12 【问题描述】:我有一个需要托管在两个不同服务器上的 ASP.NET MVC 项目。我知道这看起来很奇怪,但这是我客户的要求。
具体来说,我将有 2 台负载均衡的服务器
Web 服务器 - 公开(域将指向此服务器的公共 ip) 应用服务器 - 与内部基础架构(Active Directory、数据库、安全等)通信我正在考虑创建另一层(ASP.NET Web API),以便网络服务器仅提供 html 页面,应用服务器将包含业务逻辑并为所有客户端公开端点(网络,移动)打电话。 Web Server 将通过 RESTFUL 服务与 App Server 通信。
有没有更好的办法?任何解决方案将不胜感激。
提前致谢,
【问题讨论】:
【参考方案1】:这是一种相当正常的做事方式——让 Web 服务器专注于服务页面,让后端服务器处理应用程序业务逻辑的繁重工作。如果它在大量数据吞吐量的情况下大量使用,我会考虑将其设置为三层,分别具有单独的 Web、应用程序和数据库服务器。
Web API 也是两台服务器之间通信的不错选择,但如果您发现需要超越基本 REST 操作,则可能值得考虑将 WCF 作为替代方案。不过,让它运行起来需要更大的开销,而且绝对不适合胆小的人!
编辑
因此,您需要做的是将所有当前业务逻辑从现有控制器中移出,并移至位于第二台服务器上的一组相应的 Web API 控制器中。如果您小心,您应该能够将您的 MVC 控制器方法直接复制到您的 Web API 控制器中并添加适当的路由属性。您的数据库(如果有的话)也需要位于第二台服务器上。
完成此操作后,所有 MVC 控制器都会调用在第二台服务器上运行的 Web API。 MVC 控制器不应该对您的数据进行任何类型的处理,除了基本的调整以使其看起来不错(无论如何,保持控制器清洁是一种很好的做法)。
这应该让您对需要做什么有一个基本的了解。如果您需要任何关于任何步骤的更具体的信息,请大声喊叫,我会看看我是否可以详细说明。
【讨论】:
我了解这种架构的优势,但是在这种情况下,ASP.NET MVC 将无法工作(视图和控制器紧密耦合)。有什么办法可以在不修改所有内容的情况下分离 MVC 项目? 啊,我明白你现在要做什么了。不,您不能将现有的 MVC 项目拆分,正如您所说的控制器和视图是紧密耦合的。我将用更详细的解释更新我的答案,但是是的,您需要将业务逻辑从 MVC 控制器中取出。 当我从 MVC 控制器调用 webapi 控制器时,我应该进行内部调用还是 Web 服务调用?我也遇到了表单身份验证的问题,因为当前的身份验证逻辑是在 MVC 层中编写的,将它移到 WebAPI 层需要付出很多努力。此外,我需要实现重试逻辑以及保护 API(仅允许受信任的应用程序连接)以使其更加健壮。有什么想法吗?谢谢 我不确定您所说的“内部调用”是什么意思,MVC 控制器将需要对第二台服务器上的 Web API 层进行 HTTP 调用。将您的 FBA 保留在 Web 服务器上很好,但请考虑将您的用户存储(在 SQL 或 Active Directory 或其他中)移动到应用程序服务器上。您的应用服务器应该有防火墙,这样只有 Web 服务器才能连接到它,并且所有内部连接都应该使用 HTTPS。如果您需要对应用服务器和 Web 服务器上的调用进行身份验证,则需要考虑迁移到基于声明的模型 - 我无法在评论中加入!【参考方案2】:我们在项目中使用了类似的结构。服务层公开了多个网站和移动应用程序正在使用的 REST API。这种架构的美妙之处在于,所有的业务复杂性都隐藏在 API 后面,而前端主要处理演示需求。
但在开发此架构时需要注意两件事:
1.保护端点(REST API) - 如果您计划开发将使用 API 的移动应用程序,那么您必须通过防火墙公开端点并使其可以访问互联网。一种选择是使用不记名令牌验证来验证请求。您可以使用 Oauth 协议来保护端点。
2。序列化和反序列化的挑战: 由于 REST 使用 JSON 作为数据传输的标准格式,而 Json 不是强类型,因此挑战在于将数据映射到两端的适当模型。为了解决这个问题,我们为模型创建了一个通用项目并添加到(api 和 web)项目中。在 API 结束时,我们对模型进行序列化,我们将其反序列化为 Web 项目中的相同模型。他们完美地映射,没有打嗝。
希望以上提示对您有所帮助。
【讨论】:
以上是关于在两台物理服务器中托管 ASP.NET MVC 项目的主要内容,如果未能解决你的问题,请参考以下文章
从 Azure 中托管的 ASP.NET Core 5.0 MVC 站点调用 API/服务的间歇性套接字异常
ASP.Net MVC 3/4 托管在 IIS 7.5 默认处理程序映射上