NetMsmqBinding result = new NetMsmqBinding(NetMsmqSecurityMode.None); result.ExactlyOnce = false; 第三:服务托管方式问题。 由于本人还未将netMsmqBinding托管在IIS上,所以只能托管在windows服务中,本来托管在控制台也可以,但应用程序的开启比较容易受其它登录用户的影响。这托管成windows服务时遇到如下问题: 场景:我需要将同一服务程序,部署为N个不同端口不同服务名称的服务。 问题:当安装一个服务后,正常启动,在安装第二个服务时,第二个服务的执行地址会记成第一个服务的地址。 分析:有可能是windows服务在安装过程中有安装记录,即使指定了服务程序路径也会受影响,大家有啥好办法就请教。 解决方案:将服务的exe,config更改名称,例如ComputeAsyncTask_Hight_1.exe,ComputeAsyncTask_Hight_2.exe,ComputeAsyncTask_Hight_3.exe,这种情况下,安装后的执行路径就没有问题。 遗留问题:虽然上面方案能解决执行路径问题,但在如下情况下依然有问题: 当所有服务都正常安装后,再次执行安装,比如再次安装ComputeAsyncTask_Hight_1.exe,首先是服务删除,此时系统所识别的assemblypath依然是ComputeAsyncTask_Hight_3.exe,此时就会将ComputeAsyncTask_Hight_3删除,这种情况目前还未找到好的方法。 第四:如何快速彻底删除一个windows服务 当一个服务安装后,但由于某些BUG做了调整,在某种情况下就会出现无法删除服务的情况,这种问题经常消耗我大量时间去排查,我们可以借用用sc.exe这个Windows命令来解决,效果非常好,再也不用花精力去分析服务为什么不能删除的原因了。 开始——运行——cmd.exe,使用办法很简单: sc delete "服务名" (如果服务名中间有空格,就需要前后加引号) 第五:在服务的安装类中不能引用app.config 如果将服务托管为windows服务,一般都会编写服务安装代码,这样我们就可以利用ManagedInstallerClass.InstallHelper来实现服务的自动安装,它主要是用来代替Installutil.exe手工操作。我在项目中需要将同一服务程序部署为不同端口不同服务名称的服务,所以我考虑将服务名称从app.config中指定,于是就是类似下面的代码:
service = new ServiceInstaller(); service.ServiceName = ConfigurationManager.AppSettings["ServiceName"].Trim();
但在安装过程中总是报错,查明原因,是无法找到配置节,最后才知道当服务在安装时,并不是一个应用程序,理所当然就不会加载app.config,所以在安装类中我们不能调用app.config。 解决方案:将配置节从app.config中转移,比如新建一个xml文件,然后在安装时,服务名称等信息从xml配置文件中读取。
service.ServiceName = GetComputeLevel(); private string GetComputeLevel() { try { string strPath; XmlDocument xmldoc = new XmlDocument(); XmlNode xmlnd; strPath = System.Environment.CurrentDirectory + @"\ComputeLevelConfig.xml"; strPath = AppDomain.CurrentDomain.BaseDirectory + @"\ComputeLevelConfig.xml"; if (!File.Exists(strPath)) { throw new FileNotFoundException("未能找到配置文件"+strPath); } xmldoc.Load(strPath); xmlnd = xmldoc.SelectSingleNode("ComputeLevelConfig"); if (null != xmlnd) { return xmlnd.InnerText.Trim (); } else { throw new Exception("没有指定计算优先级!" + strPath); } } catch (Exception ex) { throw ex; } }
最新评论