ASP.NET MVC 中应用Windows服务以及Webservice服务开发分布式定时器

Posted 天道酬勤,勤能补拙。地道酬实,实能不弱。生有涯 力有限

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ASP.NET MVC 中应用Windows服务以及Webservice服务开发分布式定时器相关的知识,希望对你有一定的参考价值。

ASP.NET MVC 中应用Windows服务以及Webservice服务开发分布式定时器
一:闲谈一下:
1.现在任务跟踪管理系统已经开发快要结束了,抽一点时间来写一下,想一想自己就有成就感啊!! 
2.关于任务跟踪管理系统项目中遇到的Windows服务以及Webservice的综合应用的问题。

大家好这是我第二次写博客 ,写的不好请大家多多谅解, 希望大家可以多多指正。

二:我稍微的整理了一下关于这个分布式定时器需求:
1.根据任务跟踪管理系统中的数据库的AnswerSheet 表格中找到客户编号(CustomerID 为空) ,电话号码不为空的记录
2.第一种情况:根据不为空的电话号码(从内部的过河兵系统的数据库Customer表中查询数据当然过河兵系统中要进行维护Phone电话号码)则调用Webservice API 查询客户的CustomerGUID/CustomerID 并将这个字符串返回到任务跟踪管理系统如果两个不为空则调用AnswerSheetEdit()方法更新对应的任务跟踪管理系统的AnswerSheet中的CustomerGUID/CustomerID

3.第二种情况:根据不为空的电话号码则Webservice API 查询不到客户的CustomerGUID/CustomerID那么需要在过河兵系统的Survey表格中插入AnswerSheetID 和SurveyID  
并进行更新过河兵对应的Customer表中的CustomerGUID/CustomerID 数据

4.每天夜里23:30 定时更新任务跟踪管理系统的数据以及添加删除过河兵系统的数据

5.分布式定时器的作用是定时更新任务跟踪管理系统和过河兵系统的用户以及问卷的数据。

6.Windows 定时器的源代码

        private static readonly SurveyHandle _surveyHandle = new SurveyHandle();
        private static readonly WebServerInterFaceHandle _webServerInterFaceHandle = new WebServerInterFaceHandle();
        public ServiceTime()
        {
            InitializeComponent();
        }
        protected override void OnStart(string[] args)
        {
            //定义定时器
            Timer myTimer = new Timer(1000);
            myTimer.Elapsed += new ElapsedEventHandler(TaskTimeAction.ServiceTime);
            myTimer.Enabled = true;
            myTimer.AutoReset = true;
            using (StreamWriter sw = new StreamWriter("D:\\任务跟踪管理定时器日志.txt", true))
            {
                sw.WriteLine(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss ") + "定时器服务启动");
            }
        }
        protected override void OnStop()
        {
            using (StreamWriter sw = new StreamWriter("D:\\任务跟踪管理定时器日志.txt", true))
            {
                sw.WriteLine(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss ") + "Stop.");
            }
        }

 /// <summary>
            /// 定时器委托任务 调用的方法
            /// </summary>
            /// <param name="source"></param>
            /// <param name="e"></param>
            public static void ServiceTime(object source, ElapsedEventArgs e)
            {
                SurveyController surveyController = new SurveyController();
                if (DateTime.Now.ToString("HH:mm:ss") == "23:30:00")
                {
                 
                    Content = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss" + "夜里23:30");
                    List<AnswerSheet> answerSheetList = _surveyHandle.GetAnswerGuidList();
                    SurveyAndAnswerSheet surveyAndAnswer = new SurveyAndAnswerSheet();
                    foreach (var items in answerSheetList)
                    {
                        #region 定时同步更新任务跟踪管理系统以及过河兵系统的用户以及问卷的数据
                        AnswerSheet answerSheet = _surveyHandle.GetAnswerSheet(items.ID);
                        Survey survey = _surveyHandle.GetSurvey(answerSheet.SurveyID);
                        //进行查询AnswerIndex中的详细的内容
                        //AnswerSheet  answerSheetModel= _surveyHandle.GetAnswerSheetDetail(items.ID);   
                        string model = _webServerInterFaceHandle.GetCustomerJson(items.CustomerID, items.CustomerPhone);
                        using (StreamWriter sw = new StreamWriter("D:\\任务跟踪管理系统定时器日志.txt", true))
                        {
                            sw.WriteLine(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss ") + "答卷编号:" + items.ID + "客户编号:" + model);
                        }
                        if (model != null)
                        {
                            string[] getCustomerID = model.Split(‘|‘);
                            string Image = null;
                            if (answerSheet.AttachList != null)
                            {
                                foreach (var image in answerSheet.AttachList)
                                {
                                    Image += image.imgURL.Split(‘|‘).Last();
                                }
                            }
                            answerSheet.CustomerGUID = getCustomerID[0];
                            answerSheet.CustomerID = getCustomerID[1];
                            surveyAndAnswer.AnswerSheet = answerSheet;
                            surveyAndAnswer.Survey = survey;
                            surveyController.AnswerSheetEdit(surveyAndAnswer, "/Uploads/" + Image);
                        }
                        #endregion
                    }
                    using (StreamWriter sw = new StreamWriter("D:\\任务跟踪管理系统定时器日志.txt", true))
                    {
                        sw.WriteLine(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss ") + ":" + "结束时间");
                    }
                }
            }

        private SelectCusutomer.WebUseSevrices webServices = new SelectCusutomer.JieChuDianUseSevrices();//真实环境
        private  SelectCustomer2.WebUseSevrices _webServices = new SelectCustomer2.JieChuDianUseSevrices();//测试环境
三为什么要写Windows服务和Webservice 服务
1.通过产品经理和客户的最终的确定,最后让我将这个新的功能添加进去,所以我也就积极的去做了。
用了半天的时间将定时器开发完成,最终放在ASP.NET MVC 的Global.asax 的文件中。
2.下一步我新建了一个项目Webservice API当我写这个API 的时候老大让我用Webservice而不是WCF!WCF 多好啊!!通过又是半天的学习开始写Webservice API 的服务经过调试和最后发布到测试的服务器上最终没有问题了。
3.于是两者开始进行对接通过在任务跟踪管理系统中进行调试完全没有问题对接也成功了,两边的数据库中的数据也就行更新了。
4.通过最后我将任务跟踪管理系统发布到IIS 7.0上去到了指定的时间数据没有更新找到了通过IIS闲置超时的时间为1440分钟以及修改应用程序池的配置搞了一天最终还是没有达到两边的系统的数据同步,
最终还是应用程序池回收了内存资源以及上网查了一下关于IIS具有的不稳定性。
5.最后我决定用Windows 服务进行开发定时器原因稳定性以及性能都非常好。
四:关于Windows服务的创建以及调用Webservice服务
五:通过修改Windows服务下面的
App.config:来进行修改数据库的配置的文件连接数据库字符串。

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <appSettings>
    <add key="ContactPoint" value="server=;database=TaskTrackData;uid=sa;password=sa;multipleactiveresultsets=True" />
    <add key="ClientSettingsProvider.ServiceUri" value="" />
  </appSettings>
  <startup>
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.2" />
  </startup>
  <system.web>
    <membership defaultProvider="ClientAuthenticationMembershipProvider">
      <providers>
        <add name="ClientAuthenticationMembershipProvider" type="System.Web.ClientServices.Providers.ClientFormsAuthenticationMembershipProvider, System.Web.Extensions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" serviceUri="" />
      </providers>
    </membership>
    <roleManager defaultProvider="ClientRoleProvider" enabled="true">
      <providers>
        <add name="ClientRoleProvider" type="System.Web.ClientServices.Providers.ClientRoleProvider, System.Web.Extensions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" serviceUri="" cacheTimeout="86400" />
      </providers>
    </roleManager>
  </system.web>
</configuration>
六:安装服务通过命令
CMD 以管理员身份打开然后执行就可以了。
C:\Windows\Microsoft.NET\Framework\v4.0.30319\installutil.exe D:\WindowsService\WindowsService.exe  
C:\Windows\Microsoft.NET\Framework\v4.0.30319\installutil.exe -u D:\WindowsService\WindowsService.exe  

以上是关于ASP.NET MVC 中应用Windows服务以及Webservice服务开发分布式定时器的主要内容,如果未能解决你的问题,请参考以下文章

与 windows 服务共享 asp.net mvc 会话

将 asp.net WebForms 应用程序中的组合表单/Windows 身份验证迁移到 asp.net MVC 应用程序

ASP.NET MVC 4 混合认证模式

IIS 中的 Asp.Net 核心 MVC 应用程序 Windows 身份验证

ASP.NET MVC 4 的 Windows 身份验证 - 它是如何工作的,如何测试它

在 ASP.NET MVC 3 应用程序中扩展 Windows 身份验证