2012-05-27 96 views
1

现在,我有一个ASP.NET MVC应用程序。我在ASP.NET MVC应用程序中从外部Windows桌面(不是我的)应用程序(通过TCP/IP)检索数据的几个方法。现在我想将这些方法移到外部服务(程序),还有其他方法(发送电子邮件消息和其他处理,现在在单独的线程中运行)。这是我第一次使用Web服务/ wcf。而且,有什么更好的方式来做到这一点:wcf,web服务,赢得服务?
感谢什么是我的任务的最佳选择(wcf,web服务,win服务)

更多细节:
在ASP.NET MVC应用程序,我得到来自外部的桌面(我的)应用程序(通过TCP/IP)的各种信息。例如在这个程序中创建事件:电影,体育,剧院和时间表。另外,还有多少个座位留给特定的会议等等。
不同类型的信息可以通过各种方式获得。有时,我会每分钟检查一次是否有更新(事件列表,shedules)。有时我需要每分钟获取其他信息以便进行更改(会话剩余多少个席位)。因此,我有许多任务是在一个单独的线程和方法中执行的,如下所述。

对于使用下面的方法,我从外部双赢程序更新:

protected void Application_Start() 
{ 
    AddTask("UpdateFromExternalProgram", "60", 60); 
} 

private static CacheItemRemovedCallback _onCacheRemove = null; 
public static void AddTask(string name, string value,int seconds) 
{ 
    _onCacheRemove = new CacheItemRemovedCallback(CacheItemRemoved); 
    HttpRuntime.Cache.Insert(name, value, null, 
         DateTime.Now.AddSeconds(seconds), Cache.NoSlidingExpiration, 
         CacheItemPriority.NotRemovable, _onCacheRemove); 
} 

    private static void CacheItemRemoved(string key, object value, CacheItemRemovedReason reason) 
    { 
     if (reason == CacheItemRemovedReason.Expired) 
     {    
       AddTask(key, value.ToString(), Convert.ToInt32(value)); 
       GetUpdatesFromExternalProgram();    
     } 
    } 
private static void GetUpdatesFromPremiera() 
{ 
    //creates TCP/IP client, send request, and parse response 
} 

而且,在一个单独的线程发送现场(登记,反馈等信息)的所有电子邮件:

ThreadPool.QueueUserWorkItem(new WaitCallback(SendEmailInSeparateThread), senderInfo); 

而且,我想将这个功能转移到其他应用程序中:wcf,web服务或win服务。

回答

2

您应该在ASP.NET应用程序中使用avoid implementing recurring background tasks。 Windows服务是实现此功能的更好选择。

+0

为什么windows服务不是web服务?什么是prons和cons? – user1260827

+0

它将取决于Web服务类型。但是,如果您在IIS(经典ASMX或IIS托管的WCF服务)中托管此Web服务,则您正在使用ASP.NET应用程序。在这种情况下阅读Phil Haack文章,为什么在ASP.NET应用程序中实现循环后台任务很糟糕。在任何时候,IIS都可以回收这个ASP.NET应用程序,停止所有活动并杀死所有线程。 –

相关问题