Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/29.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在两台物理服务器中托管ASP.NET MVC项目_C#_Asp.net_Asp.net Mvc_Iis_Asp.net Web Api - Fatal编程技术网

C# 在两台物理服务器中托管ASP.NET MVC项目

C# 在两台物理服务器中托管ASP.NET MVC项目,c#,asp.net,asp.net-mvc,iis,asp.net-web-api,C#,Asp.net,Asp.net Mvc,Iis,Asp.net Web Api,我有一个ASP.NET MVC项目,需要托管在两个不同的服务器上。我知道这看起来很奇怪,但这是我客户的要求 详细地说,我将有2个负载平衡的服务器 Web服务器-公开(域将指向此服务器的公共ip) 应用服务器-与内部基础架构(Active Directory、数据库、安全等)通信 我正在考虑创建另一层(ASP.NET Web API),这样Web服务器只提供HTML页面,应用服务器将包含业务逻辑,并公开所有客户端(Web、移动)调用的端点。Web服务器将通过RESTFUL服务与应用服务器通信

我有一个ASP.NET MVC项目,需要托管在两个不同的服务器上。我知道这看起来很奇怪,但这是我客户的要求

详细地说,我将有2个负载平衡的服务器

  • Web服务器-公开(域将指向此服务器的公共ip)
  • 应用服务器-与内部基础架构(Active Directory、数据库、安全等)通信

我正在考虑创建另一层(ASP.NET Web API),这样Web服务器只提供HTML页面,应用服务器将包含业务逻辑,并公开所有客户端(Web、移动)调用的端点。Web服务器将通过RESTFUL服务与应用服务器通信

还有更好的办法吗?任何解决方案都将不胜感激


提前感谢,

这是一种相当正常的做法-让web服务器专注于服务页面,让后端服务器使用应用程序业务逻辑完成繁重的工作。如果它在大数据吞吐量下大量使用,我会考虑将它分为三层,包括单独的Web、应用程序和数据库服务器。 WebAPI对于两台服务器之间的通信也是一个不错的选择,但是如果您发现需要超越基本的REST操作,那么可以考虑使用WCF作为替代方案。不过,让它运行起来的开销更大,而且这绝对不是为胆小的人准备的

编辑

因此,您需要做的是将当前所有的业务逻辑从现有的控制器中移出,并移入一组相应的Web API控制器中,这些控制器将位于第二台服务器上。如果小心,您应该能够将MVC控制器方法直接复制到Web API控制器中,并添加适当的路由属性。您的数据库(如果有)也需要位于第二台服务器上

完成后,MVC控制器所要做的就是调用第二台服务器上运行的Web API。MVC控制器不应该对您的数据进行任何类型的处理,而只是进行一些基本的调整,以使其看起来更漂亮(保持控制器干净是一种很好的做法)


这应该给你一个基本的想法,你需要做什么。如果您需要关于任何步骤的更具体的信息,请大声说出来,我看看是否可以详细说明。

我们在项目中使用了类似的结构。服务层公开多个网站和移动应用程序正在使用的RESTAPI。这种架构的美妙之处在于,所有业务复杂性都隐藏在API后面,而前端主要处理表示需求

但在开发此体系结构时,需要注意两件事:

1。保护端点(REST API)-如果您计划开发使用这些API的移动应用程序,那么您必须通过防火墙公开端点,并使其可以访问internet。其中一个选项是使用承载令牌验证对请求进行身份验证。您可以使用Oauth协议来保护端点

2。序列化和反序列化方面的挑战:由于REST使用JSON作为数据传输的标准格式,并且JSON不是强类型的,因此挑战在于将数据映射到两端适当的模型。为了解决这个问题,我们为模型创建了一个公共项目,并将其添加到(api和web)项目中。在API结束时,我们将一个模型序列化,然后在web项目中将其反序列化为同一个模型。他们完美地绘制了地图,没有打嗝


希望以上提示能对你有所帮助

我理解这种体系结构的优点,但在这种情况下,ASP.NET MVC将无法工作(视图和控制器紧密耦合)。有没有办法在不修改所有内容的情况下分离MVC项目?啊,我明白你现在想做什么了。不,你不能把一个现有的MVC项目分割开来,因为你说控制器和视图是紧密耦合的。我将用更详细的解释更新我的答案,但是是的,您需要将您的业务逻辑从MVC控制器中移除。当我从MVC控制器调用webapi控制器时,我应该进行内部调用还是web服务调用?我在表单身份验证方面也遇到了问题,因为当前的身份验证逻辑是在MVC层编写的,要将其迁移到WebAPI层需要付出很多努力。此外,我还需要实现重试逻辑以及保护API(仅允许受信任的应用程序连接)以使其更加健壮。有什么想法吗?谢谢我不确定“内部调用”是什么意思,MVC控制器需要对第二台服务器上的Web API层进行HTTP调用。将FBA保留在Web服务器上是很好的,但是可以考虑将用户存储(在SQL或ActiveDirectory或任何东西)移动到App Server上。您的应用程序服务器应该防火墙,以便只有web服务器可以连接到它,并且所有内部连接都应该使用HTTPS。如果您需要验证App Server和Web服务器上的调用,那么您需要考虑移动到基于声明的模型——而不是我可以放入评论中的东西!