通常我会考虑编写Windows服务来管理不适合托管在Web应用程序中的任务.这些类型的任务通常是长时间运行的进程或计划任务.虽然这通常是这些类型任务的主要方法,但人们已经开始研究在Web应用程序中运行这些后台进程的方法,方法是在Global.asax公开的Application_Start事件中启动许多线程.这种方法的问题一直是,如果你的IIS工作进程死了,那么你的后台线程也会被杀死(实际上你的'Windows服务'会被停止,直到收到下一个请求).
ASP .NET 4.0提供了解决此问题的方法.您现在可以将StartMode设置为'AlwaysRunning',如Scott Gu 在此博客文章中所述.某处在这个帖子上的评论,有人问一个有关IIS托管的Windows服务类型的任务,因为新的功能,保证了工作进程始终运行的可行性问题.斯科特提到它肯定会支持这种情况.除此之外,最近推出的AppFabric意味着Microsoft本身正在提供简单的钩子来托管和监控Web应用程序中的WCF和WF服务.
对于我们这些曾经编写Windows服务来支持我们的网络应用程序的人来说,这意味着什么?我们应该采用这种模式吗?有什么陷阱?据我所知,在Web应用程序中托管"Windows服务"流程有很多好处,最有用的是易于部署.此外,我们实际上可以开始为我们的服务开发简单的用户界面,这些界面提供有关运行时发生的事情的信息.
如果我不得不走这条路,我认为我不会在面向客户的Web应用程序中托管我的"Windows服务"类型功能.我可能会开发一个新的Web应用程序项目(很像我将在Windows服务上下文中),它将托管我的长时间运行/计划任务进程.我想这个原因很少.
我会听到关于这种做法是否我应该使用Windows服务来坚持你的想法很感兴趣.我很想尝试这种新方法.
如何设置Windows Server AppFabric缓存服务可用的内存量?
我们在托管网站的同一台服务器上运行AppFabric Cache,我希望能够控制缓存消耗多少RAM.
我希望尽可能灵活地使我的应用程序灵活,但不要让我的界面过于具体,从而陷入困境.
存储库的最佳对象类型是什么?IEnumerable,IQueryable还是List?
我正在考虑使用的技术是
Azure App Fabric缓存
实体框架4.1
可能是Windows Server AppFabric
repository appfabric appfabric-beta-2 azure-appfabric entity-framework-4.1
似乎有两个名称相似的产品,但不是我所期望的.我认为Azure AppFabric是Windows Server AppFabric的"云"版本,但它们之间似乎没有太多共同之处.
我错过了更大的图片吗?
是否有建议的方法来清除DataCache中的所有对象?
我可以使用DataCache.GetObjectsByAllTags方法,但这需要一个区域,我无法使用,因为我需要在多个缓存主机之间共享对象.
根据您的目标是Windows Azure或Windows Server,在发现缓存API严重不同之后,我担心微软不会继续为Windows Server开发AppFabric.有谁知道AppFabric for Windows Server是否仍然受支持/开发?
有没有办法在系统启动时自动启动缓存集群?我在远程PC上运行它,当它重新启动时,我必须远程进入它并使用Start-CacheCluster从Powershell重新启动缓存集群,并且不希望这样做.
谢谢,
詹姆士
我们遇到AppFabric问题,导致出现以下错误:
Exception type: ArgumentException
Exception message: An item with the same key has already been added.
at System.Collections.Generic.Dictionary`2.Insert(TKey key, TValue value, Boolean add)
at Microsoft.ApplicationServer.Caching.DataCacheFactory.CreateRoutingClient(String cacheName, NamedCacheConfiguration config)
at Microsoft.ApplicationServer.Caching.DataCacheFactory.CreateNewCacheClient(DataCacheDeploymentMode mode, String cacheName, NamedCacheConfiguration config, IClientChannel channel)
at Microsoft.ApplicationServer.Caching.DataCacheFactory.GetCache(String cacheName)
at Microsoft.ApplicationServer.Caching.DataCacheFactory.GetDefaultCache()
... our code where we are attempting to retrieve a cache item from the default cache by its key
Run Code Online (Sandbox Code Playgroud)
这个错误在我们的测试环境中很少发生(我们没有找到按需重现问题的方案),但似乎总是在每次部署之后在我们的生产环境中发生.我们的部署是自动化的,我们已经验证了部署到各种环境的步骤是相同的.
我们针对给定环境的服务器设置如下:
这些服务器是负载平衡的.已在两个应用程序上启用AppFabric本地缓存.我们的测试和生产服务器设置相同.我们知道将AppFabric放在专用服务器上会更好,但不要认为这会导致/解决此问题.
我们对此问题感到困惑,因为我们在网上其他地方没有发现任何提及它,因为堆栈跟踪似乎表明这是AppFabric本身的一个问题.异常提到插入内容,但是当发生这种情况时我们正在尝试从DataCacheFactory获取默认缓存,以便我们可以从中检索项目.那么,这个错误意味着什么以及我们如何解决它?
更新
这是我用来DataCacheFactory从缓存中创建和提取数据的代码:
private static readonly Lazy<DataCacheFactory> …Run Code Online (Sandbox Code Playgroud) 我在服务器上安装了AppFabric.我创建了一台计算机的集群.我还创建了一个名为"Gagan"的缓存.按顺序使用以下命令
Use-CacheCluster -Provider xml -ConnectionString\NB-GJANJUA\Cache Start-CacheCluster
结果是缓存服务已启动并运行..这么好.
然后我设置我的web.config文件,如下所示
<?xml version="1.0"?>
<configuration>
<configSections>
<section name="dataCacheClient"
type="Microsoft.ApplicationServer.Caching.DataCacheClientSection,
Microsoft.ApplicationServer.Caching.Core, Version=1.0.0.0,
Culture=neutral, PublicKeyToken=31bf3856ad364e35"
allowLocation="true"
allowDefinition="Everywhere"/>
</configSections>
<!-- cache client -->
<dataCacheClient>
<!-- cache host(s) -->
<hosts>
<host
name="NB-GJANJUA.com"
cachePort="22233"/>
</hosts>
</dataCacheClient>
<system.web>
<compilation debug="true" targetFramework="4.0" >
<assemblies>
<add assembly="System.Core, Version=3.5.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089"/>
<add assembly="System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
<add assembly="System.Data.DataSetExtensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089"/>
<add assembly="System.Xml.Linq, Version=3.5.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089"/>
<add assembly="Microsoft.ApplicationServer.Caching.Client, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
<add assembly="Microsoft.ApplicationServer.Caching.Core, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
</assemblies>
</compilation>
<sessionState mode="Custom" customProvider="SessionStore" cookieless="true">
<providers> …Run Code Online (Sandbox Code Playgroud) 我有一个ASP.Net MVC应用程序,它大量使用session来保存状态(包括大数据集合).目前,它托管在一个Web服务器上.会话设置为InProc的默认值.
出现了一个问题,即当许多用户在线时,应用程序会冻结某些用户.我想这是因为InProc会话不能很好地扩展,并且该进程只有很多可用内存.(如果内存需求超过可用内存会发生什么 - 它是否会换出磁盘?)
我有几个解决方案可以帮助实现可伸缩性.(a)Sql server会话状态; (b)配置会话状态以使用AppFabric缓存.第一个选项看起来是一个很好的解决方案,除了它会影响性能并要求存储的项目可序列化.
如何在单个Web服务器也用作缓存主机的环境中配置会话状态以使用AppFabric缓存(也称为Velocity)?在单一服务器环境中,这与InProc有何不同?这会提供比InProc更多的可扩展性和可用内存,还是基本上会达到相同的约束?