Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/30.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# 在azure中托管共享dll_C#_Asp.net_Winforms_Dll_Azure - Fatal编程技术网

C# 在azure中托管共享dll

C# 在azure中托管共享dll,c#,asp.net,winforms,dll,azure,C#,Asp.net,Winforms,Dll,Azure,我有一个C#类库,正在编译成几个应用程序,所有这些应用程序都作为ASP.NET 4.0 WebForm和/或Azure上的MVC云服务托管。我想集中这个库,这样对包的任何更新都不需要在每个更新周期编译和部署每个项目 显然,我可以选择创建一个WCF服务,但是这需要我重构类库以及使用它的每个项目,以成为服务的使用者,并且由于系统的复杂性,这可能需要几个月的时间,短期内不是一个选项 既然我的所有项目都在Azure上的同一个关联组中,那么除了集中此DLL及其所有项目共享的方法之外,还有其他方法吗?我在网

我有一个C#类库,正在编译成几个应用程序,所有这些应用程序都作为ASP.NET 4.0 WebForm和/或Azure上的MVC云服务托管。我想集中这个库,这样对包的任何更新都不需要在每个更新周期编译和部署每个项目

显然,我可以选择创建一个WCF服务,但是这需要我重构类库以及使用它的每个项目,以成为服务的使用者,并且由于系统的复杂性,这可能需要几个月的时间,短期内不是一个选项


既然我的所有项目都在Azure上的同一个关联组中,那么除了集中此DLL及其所有项目共享的方法之外,还有其他方法吗?我在网上找不到任何东西,所以我希望从社区中获得一些好的选择和思想开创者。如果我遗漏了任何细节,请告诉我。

在同一数据中心的blob存储中存储共享DLL如何?在角色启动时,每个实例都会将最新的DLL下载到其本地存储(在应用程序的根目录或其他需要的文件夹中)

在同一个数据中心内,blob存储和您的角色实例之间的带宽是免费的,并且是100Mbps x#个内核,因此速度非常快。而且,要更新DLL,只需将其上载到一个位置(blob容器)

在更新其中一个DLL时,您需要向您的角色实例发出信号,要求其回收(最安全的方法),或者使用最新的DLL更新自身。您不能像拥有文件监视程序那样拥有“blob监视程序”(因此建议发送一个信号)。或者,您可以让某种类型的后台线程每隔几分钟检查一个“dll”容器,当发现一个已更改的容器时,在本地触发更新


警告一句:如果您更新了DLL,并且每个角色实例都在轮询更改(或收到循环使用的信号),请注意不要同时循环使用所有实例。否则,您将得到一个暂时不可用的服务。

如何将共享DLL存储在同一数据中心的blob存储中?在角色启动时,每个实例都会将最新的DLL下载到其本地存储(在应用程序的根目录或其他需要的文件夹中)

在同一个数据中心内,blob存储和您的角色实例之间的带宽是免费的,并且是100Mbps x#个内核,因此速度非常快。而且,要更新DLL,只需将其上载到一个位置(blob容器)

在更新其中一个DLL时,您需要向您的角色实例发出信号,要求其回收(最安全的方法),或者使用最新的DLL更新自身。您不能像拥有文件监视程序那样拥有“blob监视程序”(因此建议发送一个信号)。或者,您可以让某种类型的后台线程每隔几分钟检查一个“dll”容器,当发现一个已更改的容器时,在本地触发更新


警告一句:如果您更新了DLL,并且每个角色实例都在轮询更改(或收到循环使用的信号),请注意不要同时循环使用所有实例。否则,您将得到一项暂时不可用的服务。

David在解释如何管理库的部署方面做得很好。但除此之外,您还需要在体系结构中进行更改,以支持这种相当动态的场景

首先,应用程序不应该使用实现,而应该使用接口。让我们假设您的库允许您计算税收,并且该税收计算器的实现每隔几周更改一次。您不希望每次都为此更改应用程序,而且很明显,WCF服务不适合您

现在您可以按如下方式实现它:

  • 类库:TaxCalculator.Contracts包含ITaxCalculator接口
  • 类库:TaxCalculator.ImplementationABC包含实现ITaxCalculator接口的ABCTaxCalculator类
  • 类库:TaxCalculator.ImplementationDEF包含实现ITaxCalculator接口的DEFTaxCalculator类(几周后)
  • 等等
您的ASP.NET MVC网站只能使用ITaxCalculator界面。使用可以扫描文件夹(LocalResource)中包含实现ITaxCalculator接口的类的任何程序集。因此,您将web应用程序与税务计算器库解耦

正如David已经解释过的,您可以将库的最新版本存储在blob存储中,并在本地下载(在本地资源中),然后再使用MEF加载程序集。这样,原始应用程序将保持不变,并且您仍然可以对库进行必要的更改

为了通知每个实例新版本已经发布,您有几个选项。您可以运行一个计时器来检查容器中的更改,您可以使用服务总线主题(每个实例都将订阅该主题)。。。但正如David已经解释的,您需要自己管理应用程序的滚动升级


另一种方法是重新部署应用程序,而不是让计时器不断轮询blob容器中的更改,您只需执行一项启动任务,下载库的最新版本。

David在解释如何管理库的部署方面做得很好。但除此之外,您还需要在体系结构中进行更改,以支持这种相当动态的场景

首先,应用程序不应该使用实现,而应该使用接口。让我们假设您的库允许您计算税收,并且该税收计算器的实现每隔几周更改一次。你不知道