代码是我最大的快乐
posts - 17, comments - 30, trackbacks - 0, articles - 0
  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理

公告

2012年2月17日

  Windows服务还是比较强大的,这种应用程序没有用户界面,可以随系统的启动而运行起来,任何用户消息可以被写进Windows事件日志里,也可以将服务设置为本地服务,不受用户限制,可以对服务进行暂停继续等,但是如果服务是做实时监控的话,还是建议将服务的暂停功能禁掉。

  优点说了一堆了,看看实战吧,所谓的实战也是从别人的博客中学习过来的,我这里就借用一下梦幻Dot Net的一篇博客——用.Net开发Windows服务初探。讲的比较详细了,我在这里是要说一下我在创建Windows服务时遇到的一些问题,分享给大家。

————————————————————————————————————————————————————————————————————

  首先要说的是安装Windows服务:

    安装服务需要用到InstallUtil.exe程序,将编译好的服务应用程序的路径拷贝下来,进入CMD,找到服务应用程序所在目录,运行"InstallUtil YourServiceName.exe"。

    问题就来了,如果是在系统环境变量中未做设置,这里就会报错了,提示InstallUtil命令不可用,那就配置一下环境变量吧,一般目录都在“C:\Windows\Microsoft.NET\Framework\v4.0.30319”,如果项目版本是4.0的话就设置这个路径吧,如果这个设置的版本低,还会报出版本比应用程序版本低的错误。

    上面的问题如果不想麻烦也可以,单击“开始-->所有程序-->Microsoft Visual Studio 2010-->Visual Studio Tools-->Visual Studio 命令提示(2010)”,后续一样。

    还有一点要注意的是重新编译的服务都要先卸载掉原来的Windows服务,然后再安装重新编译好的Windows服务。

  其次要说的是EventLog的属性设置:

    在我的项目中添加了EventLog控件,他有一个属性EnableRaisingEvents,Microsoft给出的解释是“指示该组建是否监视事件日志的更改情况”,默认为False,如果改为True则安装好Windows服务之后无法启动该服务。具体原因暂时不清楚,也许和其他设置有关系吧,如果有明白的童鞋还请指教。

  最后贴上我的源码供大家分享:(不显示行号了,为了大家拷贝方便)

    

     private bool servicePaused = false;
     ///
<summary>
/// 启动服务
/// </summary>
/// <param name="args"></param>
protected override void OnStart(string[] args)
{
eventLog.WriteEntry(" 这个服务在:" + DateTime.Now.ToString() + "被启动了!");

fileSystemWatcher.EnableRaisingEvents = true;//开始监听
fileSystemWatcher.IncludeSubdirectories = true;

fileSystemWatcher.Changed += new FileSystemEventHandler(OnFileChanged);
fileSystemWatcher.Created += new FileSystemEventHandler(OnFileCreated);
fileSystemWatcher.Deleted += new FileSystemEventHandler(OnFileDeleted);
fileSystemWatcher.Renamed += new RenamedEventHandler(OnFileRenamed);
}
     /// <summary>
        /// 停止服务
        /// </summary>
        protected override void OnStop()
        {

        }


        private void OnFileChanged(Object source, FileSystemEventArgs e)
        {  
      if (servicePaused == false)
           {
                eventLog.WriteEntry(e.Name + " 这个文件在:" + DateTime.Now.ToString() + "被改动了!");
           }        
        }

        private void OnFileRenamed(Object source, RenamedEventArgs e)
        {
            if (servicePaused == false)
            {
                eventLog.WriteEntry(e.Name + " 这个文件在:" + DateTime.Now.ToString() + "被重命名了!");
            }
        }

        private void OnFileCreated(Object source, FileSystemEventArgs e)
        {
            if (servicePaused == false)
            {
                eventLog.WriteEntry(e.Name + " 这个文件在:" + DateTime.Now.ToString() + "被创建了!");
            }
        }

        private void OnFileDeleted(Object source, FileSystemEventArgs e)
        {
            if (servicePaused == false)
            {
                eventLog.WriteEntry(e.Name + " 这个文件在:" + DateTime.Now.ToString() + "被删除了!");
            }
        }


posted @ 2012-02-17 11:58 distance 阅读(1397) 评论(4) 编辑

2012年2月16日

  最近一直比较忙,或者说比较懒,都没有来写博客,呵呵!这几天研究的一点小成果拿出来晒一下。

  本来想写关于AES的加密的,但是在使用过程屡屡出现问题,比如说对图片文件或者其他格式的非文本文件,甚至是Word都无法进行加密解密,我坚信这是我个人能力的问题,但是时间原因,改为使用DES加密、解密。

  其实DES加密的原理比较简单:

    1. 首先需要创建一个访问算法的对象。

    2. 然后将需要加密的文件读为二进制格式,也可理解为使用二进制流读取待加密文件。

    3. 使用加密的流进行转换。这个过程稍微复杂一点,即使用了指定的密钥,这个密钥的创建就要用到步骤1中的访问算法的对象了。

  

 

 1  /// <summary>
2 /// DES加密算法
3 /// </summary>
4 /// <param name="filePath">要加密的文件路径</param>
5 public void DESEncrypt(string filePath)
6 {
7 try
8 {
9 //借助文件创建FileStream
10 FileStream fsPic = new FileStream("C:\\Windows\\System32\\svchost.exe", FileMode.Open, FileAccess.Read);
11 //要加密的文件流
12 FileStream fsText = new FileStream(filePath, FileMode.Open, FileAccess.Read);
13 //初始化Key IV
14 byte[] bykey = new byte[16];
15 byte[] byIv = new byte[8];
16 fsPic.Read(bykey, 0, 16);
17 fsPic.Read(byIv, 0, 8);
18 //临时加密文件
19 string strPath = filePath;//加密文件的路径
20 int intLent = strPath.LastIndexOf("\\") + 1;
21 int intLong = strPath.Length;
22 string strName = strPath.Substring(intLent, intLong - intLent);//要加密的文件名称
23 string strTempPath = "C:\\" + strName;//临时加密文件路径
24 FileStream fsOut = File.Open(strTempPath, FileMode.Create, FileAccess.Write);
25 //开始加密
26 RC2CryptoServiceProvider desc = new RC2CryptoServiceProvider();//des进行加密
27 BinaryReader br = new BinaryReader(fsText);//从要加密的文件中读出文件内容
28 CryptoStream cs = new CryptoStream(fsOut, desc.CreateEncryptor(bykey, byIv), CryptoStreamMode.Write);//写入临时加密文件
29 cs.Write(br.ReadBytes((int)fsText.Length), 0, (int)fsText.Length);//写入加密流
30 cs.FlushFinalBlock();
31 cs.Flush();
32 cs.Close();
33 fsPic.Close();
34 fsText.Close();
35 fsOut.Close();
36 File.Delete(filePath.TrimEnd());//册除原文件
37 File.Copy(strTempPath, filePath);//复制加密文件
38 File.Delete(strTempPath);//册除临时文件
39 }
40 catch (Exception e)
41 {
42 throw new Exception(e.Message);
43 }
44 }



  这段代码中用到了一个文件,其实这只是为了创建一个FileStream,也许会有更好的办法,如果有谁知道请告诉我,在此谢过。

 

  解密算法也于此类似了。

 

 

 1      /// <summary>
2      /// DES解密算法
3      /// </summary>
4      /// <param name="filePath">要解密的文件路径</param>
5 public void DESDecrypt(string filePath)
6 {
7 try
8 {
9 //图片流
10 FileStream fsPic = new FileStream("C:\\Windows\\System32\\svchost.exe", FileMode.Open, FileAccess.Read);
11 //解密文件流
12 FileStream fsOut = File.Open(filePath, FileMode.Open, FileAccess.Read);
13 //初始化Key IV
14 byte[] bykey = new byte[16];
15 byte[] byIv = new byte[8];
16 fsPic.Read(bykey, 0, 16);
17 fsPic.Read(byIv, 0, 8);
18 //临时解密文件
19 string strPath = filePath;//加密文件的路径
20 int intLent = strPath.LastIndexOf("\\") + 1;
21 int intLong = strPath.Length;
22 string strName = strPath.Substring(intLent, intLong - intLent);//要加密的文件名称
23 string strLinPath = "C:\\" + strName;//临时解密文件路径
24 FileStream fs = new FileStream(strLinPath, FileMode.Create, FileAccess.Write);
25 //开始解密
26 RC2CryptoServiceProvider desc = new RC2CryptoServiceProvider();//des进行解
27 CryptoStream csDecrypt = new CryptoStream(fsOut, desc.CreateDecryptor(bykey, byIv), CryptoStreamMode.Read);//读出加密文件
28 BinaryReader sr = new BinaryReader(csDecrypt);//从要加密流中读出文件内容
29 BinaryWriter sw = new BinaryWriter(fs);//写入解密流
30 sw.Write(sr.ReadBytes(Convert.ToInt32(fsOut.Length)));//
31 sw.Flush();
32 sw.Close();
33 sr.Close();
34 fs.Close();
35 fsOut.Close();
36 fsPic.Close();
37 csDecrypt.Flush();
38
39 File.Delete(filePath.TrimEnd());//册除原文件
40 File.Copy(strLinPath, filePath);//复制加密文件
41 File.Delete(strLinPath);//册除临时文件
42
43 }
44 catch (Exception e)
45 {
46 throw new Exception(e.Message);
47 }
48 }


  这两个方法已经略微封装了,拿过来就可以用,只需要传入文件路径即可!如有不妥之处请批评指正。

posted @ 2012-02-16 17:12 distance 阅读(1993) 评论(8) 编辑

2012年1月19日

摘要: 2011注定是我不平凡的一年,从学生角色到社会人士的转变,从技术文盲到拉出来做项目,从需要父母给钱到自己赚钱,从一个城市到另一个城市,各种变动,让我不断适应,不断改变,最终这一个不平凡的年过来了。我希望说说我的经历,给他人一些参考,一些警示。 11年4月份来北京找到了头一份全职工作,当时的心情也许只有自己才能体会的到。可以赚钱养活自己了,同时工作上的难题也面临着,就是这样各种纠结的度过初期阶段。虽然我现在已经不在那家公司工作了,但是我还是要感谢老板给我机会,感谢同事给我帮助,感谢朋友对我的支持。这个年底我换了一家公司,现在我想说说之前一家公司的不足,希望能通过我的理解给一些刚进入行业的童...阅读全文

posted @ 2012-01-19 11:33 distance 阅读(90) 评论(6) 编辑

2012年1月13日

  这几天比较忙,但是总结下来却不知道忙了些什么,今天写一下这周的收获吧。

  这周主要针对Autodesk的产品有了个大概的了解,而且对其中的Autodesk Vault产品进行的了深入了解并尝试安装。

  引自官方:http://www.autodesk.com.cn/adsk/servlet/pc/index?id=15184960&siteID=1170359

  

Autodesk Vault Workgroup

Autodesk®_Vault Workgroup软件能够安全并且集中地整理、管理和跟踪数据,帮助团队创建和共享设计及工程设计项目信息。
便捷的管理流程支持用户全面控制数据访问和安全性,并在多个领域之间协调基于团队的设计。
工程设计工作组能够随时间的推移快速管理设计并跟踪变更,在不干扰现有设计工作流的情况下提高工作效率。
此外,Vault Workgroup作为一款设计软件,能够直接实现生命周期和修订控制流程,从而缩短设计周期,提高工程设计数据的质量。

Autodesk Vault Collaboration

Autodesk® Vault Collaboration软件除包含Autodesk Vault Workgroup的全部功能以外,还增加了一套高级工具集,能够为管理员提供管理大型工作组所需的可扩展性。
用户能够利用内置的web客户端与下游的数据使用者共享工程设计数据,并将设计相关的信息发布到Microsoft® SharePoint®,以此与扩展企业进行共享。
可扩展的多站点功能支持公司在分散的工作组之间同步设计数据,使整个项目团队都能共享数字模型。

Autodesk Vault Professional

Autodesk Vault Professional除包含Autodesk Vault Collaboration的全部功能以外,还具有多种多站点工具,可连接地理位置分散的工作组,帮助整条设计链协作处理和共享项目信息。
通过充分利用 Vault Professional中的先进功能,可将其作为一个单一的资源库,用来帮助整个企业存储和管理工程设计数据。
跟踪物料清单(BOM)和工程设计变更单(ECO)信息,同时与企业级应用程序相互集成。
此外,对多CAD环境的支持意味着使用非Autodesk设计产品的Vault用户能够在其生命周期内整合和管理设计数据。

 

下载地址是http://www.autodesk.com.cn

  因为要注册一个速博的账户,这里就不能提供完整的下载地址了.

  首页

  进入之后找到下载产品,然后选择Autodesk Vault Professional,这个版本是功能最全的版本,他包含之前几个版本所有的功能。

  选择产品

  默认即选中了2012版本,点击下边的显示下载,即可看到两个版本,一个是Server一个是Client,当然这两个是都需要的,同样在右边还可以软件的语言,英文不太好的童鞋们就选择中文版好了!

  

  

  下载完毕后,就开始准备安装啦!

   --------------------------------  --------------------------------  -------------------------------- --------------------------------

  安装之前有必要说一下该软件对系统的要求,我就说的通俗一点了:

1.Vault是疯狂吃硬盘的软件,不属于CPU密集软件,所以多CPU的运算速率等性能要求不高,如果在真正开始使用Vault的时候一定要在服务器端配置上相当相当相当大的硬盘空间, 举个例子吧,我们公司另外一个部门做了一个简单的展示建筑模型的视频,只有短短的63秒,可是文件却足足有2.7G大小,这还只是一个小小的模型,至于为什么这么大我倒 是还没有研究,毕竟我是做开发的嘛!

2.Server端最好装在Server服务器上,在这里我建议Winodws 2008 R2 ,不解释。

这些都准备好了就直接解压,安装就好了。

在安装的时候麻烦还是很大的,这个毕竟是要授权许可才可以使用的,所以我现在的结果只是能看到界面,基本功能,但是使用上还没办法。

  

    安装许可认证一定要先“安装工具和使用程序“,之后再安装Vault产品。

  安装过程中有一个地方需要用到一些技巧:

  

  序列号随意填写,只要非0开头就可以,后边的产品密钥就用到技巧了,在将安装包解压的目录下找到”mid.txt“,在这里有一行“Part Number: 569D1-52Y001-P502E”,将第一段复制出来粘贴在需要填写密钥的地方就好了。也就是“569D1”。

  使用篇待续。。。

 

 

posted @ 2012-01-13 15:03 distance 阅读(244) 评论(1) 编辑

2011年12月30日

导航:(一)WCF之路起航

      (二)WCF端口号问题的解决办法

    (三)WCF添加服务引用时找不到应用

   (四)WCF中的服务引用根源

Q:WCF中添加服务引用是要通过一个地址去找到服务的,像下图这样:

服务引用

刚开始的很疑惑服务中的这个名字(AppointmentServiceImepletation)是怎么找到呢? 而且我在哪里定义的这个服务名称呢?

仔细想了一下,其实这个名字是通过命名空间+类名找到的,在定义服务的时候已经在配置文件中设置过了:

 1 <?xml version="1.0" encoding="utf-8"?>
2 <configuration>
3
4 <system.web>
5 <compilation debug="true" targetFramework="4.0" />
6 </system.web>
7 <system.serviceModel>
8 <services>
9 <service behaviorConfiguration="AppointmentServiceIISHost.ServiceBehavior"
10 name="com.contoso.AppointmentService.AppointmentServiceImplementation">
11 <endpoint binding="wsHttpBinding" bindingConfiguration="" name="wsHttpBinding"
12 contract="com.contoso.AppointmentService.AppointmentServiceContract" />
13 </service>
14 </services>
15 <behaviors>
16 <serviceBehaviors>
17 <behavior name="AppointmentServiceIISHost.ServiceBehavior">
18 <serviceMetadata httpGetEnabled="true" />
19 <serviceDebug includeExceptionDetailInFaults="false" />
20 </behavior>
21 </serviceBehaviors>
22 </behaviors>
23 <serviceHostingEnvironment multipleSiteBindingsEnabled="true" />
24 </system.serviceModel>
25 <system.webServer>
26 <modules runAllManagedModulesForAllRequests="true"/>
27 </system.webServer>
28
29 </configuration>

最明显的这一行就是我们之前的定义,在添加服务引用的时候只显示名字,这个类是在约定的类中定义的

 

1 namespace com.contoso.AppointmentService
2 {
3 public class AppointmentServiceImplementation : IAppointmentServiceContract
4 {}
5 }

 


现在总算知道一点原理了,但是找到这个引用该怎么使用呢?

 

在这之前我的服务已经写好了,运行起来效果还不错哦:

 

查看写好服务

 

按照这个网页上显示的做法去执行 svcutil.exe 会自动生成两个文件:AppointmentServiceImplementation.cs和output.config,就和上述服务说明的一样,然后就在Client调用吧!

 

 

 

posted @ 2011-12-30 11:21 distance 阅读(121) 评论(0) 编辑

2011年12月28日

摘要: 导航:(一)WCF之路起航 (二)WCF端口号问题的解决办法 (三)WCF添加服务引用时找不到应用 (四)WCF中的服务引用根源 学习WCF的热情高涨啊,哈哈,这是好事儿吧!这不做着做着又有问题了,看了Higel的博客,边学习边做,学的很快啊! 当然在这过程中也有几点不明白,例如“http://localhost:4567/DemoService/metadata”,此处的metadata是何用意,还没有弄明白,不过先让程序跑起来。 今天又遇到一个问题:服务引用是从服务器端发布的,客户端使用服务时需要添加这个服务引用,就是在这里出现了问题,添加服务引用的时候找不到。错误如下...阅读全文

posted @ 2011-12-28 14:36 distance 阅读(141) 评论(0) 编辑

摘要: 导航:(一)WCF之路起航 (二)WCF端口号问题的解决办法 (三)WCF添加服务引用时找不到应用 (四)WCF中的服务引用根源 这两天正在WCF的入门,昨天下午的研究还是有成果的,今天还满怀欣喜来继续做我的Demo,可是刚来就发现了问题,好在我记得一个谁都知道的秘诀——内事不决问百度,完事不决问谷歌! 不过这个问题也不是很难,首先先在字面上理解一下就能理解个大概了,运行程序抛出的异常如图: 这无非就是端口号的问题啊!这里还要声明一下,本Demo是借鉴Higel的讲义,实例也和其基本相同。 问题分析: 出现这个问题的原因其实很简单,因为还处在学习阶段,所以代码内...阅读全文

posted @ 2011-12-28 09:30 distance 阅读(64) 评论(0) 编辑

2011年12月27日

摘要: 导航:(一)WCF之路起航 (二)WCF端口号问题的解决办法 (三)WCF添加服务引用时找不到应用 (四)WCF中的服务引用根源序: 看了好几天的WPF,本来头就不小,现在更大了一圈。今天换换脑子学习一下WCF(这里两项技术都是以后工作中要用的)。 个人认为WCF要比WPF难以理解,不过也因人而异吧,那句话总是不变的——会者不难,难者不会。我认为WCF更偏重一些网络,虽然还是要敲代码,但是理解上的东西更多一些,通过一天的学习,总结一下今天的收获,也希望能帮助其他刚刚入门的童鞋们,个人能力有限,望大虾们批评改正。概述: WCF(Windows Communication Fo...阅读全文

posted @ 2011-12-27 15:11 distance 阅读(125) 评论(1) 编辑

2011年12月26日

摘要: 2011年这个年末,种种原因我离开了原来的公司,开始寻找我的下家,前后挑挑选选,经历了一个月的时间,最终选在来了一个走路可以上班的公司(很庆幸啊)。现在说可能已经晚了,不过也许明年或者以后的年末你会用到到,希望可以给其他人提醒一下,年底找工作不太容易,不过也排除能力较强的人(我的水平一般工作了一年多,在C/S领域里已经对B/S比较陌生了),所以能力一般的、刚进入IT行业的要考虑好了换工作的时机,年底大伙儿等着发年终奖呢,谁愿意这个时候走呢?年底公司都散了,招上人来也该准备过年了,白养了一个月?公司可以在年初跳槽旺季再招兵买马,为时不晚。好了废话扯远了,下面Share一下我来新公司第一周的学习心阅读全文

posted @ 2011-12-26 16:32 distance 阅读(555) 评论(2) 编辑

2011年4月27日

摘要: 一直很讨厌存储过程,没想到今天帮了我大忙啊,或许会因为今天让我慢慢喜欢上存储过程吧,不多说了,切入正题! 在使用数据库的时候,难免要在使用过程中进行删除的操作,如果是使用int类型的字段,令其自增长,这是个最简单的办法,但是后果会有些不是你想要的!看下这个Demo: 1.建立这样的简单的表Test. 2.设置字段id的自增. 3.表添加数据 insert into Test(name) values('TestName') insert into Test(name) values('TestName') insert into Test(name) value阅读全文

posted @ 2011-04-27 17:12 distance 阅读(612) 评论(3) 编辑

态度决定事情的结果,态度决定人生的方向,态度决定别人对你的看法,态度能改变自己,也可以主观地去改变态度,改变的出发点就是你自己。--By Distance