一个比较麻烦的需求,关于Windows Service,上传文件等,求高手指点。

轻舟已过万重山 2006-06-17 11:58:47
需求:
另外一个系统会定时产生txt文件,放入到某个文件夹下面,我们需要写一个程序去监控这个文件夹,发现文件就加密然后上传到WEB服务器来解析这个txt文件。

1.创建一个Windows Service,让计算机启动以后就运行,最好还能控制其不能停止。
2.在这个Windows Service里面,添加一个FileSystemWatcher,监控某个电脑的某个文件夹。发现有新添加的文件的时候,对文件加密,并移动到另外一个地方。之后,用WebClient把其上传到Web服务器上。
3.定时让Windows Service从Web服务器获取信息写到Client,另外再需要实现Windows Service自动更新。

原来一直做一些简单的数据库编程,提到的东西都没怎么接触过,及时查了一下MSDN,也不知道行不行?如果可以,给些这方面的资料学学。

还需要考虑的几个问题:
1.客户端可能经常不能连接Internet。
2.文件上传好像也有几种方案,应该如何选择。
3.文件在上传的过程中失败,是否要考虑断点续传的问题。
...全文
934 37 打赏 收藏 转发到动态 举报
写回复
用AI写文章
37 条回复
切换为时间正序
请发表友善的回复…
发表回复
AIRFLYNET 2006-12-28
  • 打赏
  • 举报
回复
关注,非常有用
Knight94 2006-06-28
  • 打赏
  • 举报
回复
参看这篇文章,看看是否对你有帮助
http://www.microsoft.com/china/technet/security/guidance/secmod28.mspx
  • 打赏
  • 举报
回复
再顶一下,还有个问题.


FtpWebRequest可以打开SSL安全连接,这个东西实现不了,在服务器上要如何配置,上传的代码如何写,搜了一下,不行.


anthit 2006-06-25
  • 打赏
  • 举报
回复
傅江江 2006-06-25
  • 打赏
  • 举报
回复
我想问个问题,假如说,我在本地程序中输入一些文字,需要将这些文字保存到远程服务器中的txt中,这个由如何实现?能否不要另行保存成文件在上传,而是直接发布形式的?
wangin8181 2006-06-20
  • 打赏
  • 举报
回复
FtpWebRequest 类 实现文件传输协议 (FTP) 客户端。
WebClient 类 提供向 URI 标识的资源发送数据和从 URI 标识的资源接收数据的公共方法。
默认情况下,.NET Framework 支持以 http:、https:、ftp:、和 file: 方案标识符开头的 URI。
一个是支持特定的协议,一个是通用的.就象(oledb.dll,sqlclient.dll)这就是他们的不同.至于效率,我想,FtpWebRequest是VS2005里面新增的一个专用于FTP协议的类库,所以在FTP方面的效率要比WebClient高,应该WebClient支持的协议多了相对来说很多地方就要做到通用性,当然影响效率.当然以上纯属个人认为,没有测试.仅供参考!!!
安全性.应该差不多.FtpWebRequest可以打开SSL安全连接.而WebClient里面也支持https,所以安全性基本上看你的设置,都差不多.
  • 打赏
  • 举报
回复
多谢!
用FtpWebRequest和WebClient 的效率和安全性比较如何?
wangin8181 2006-06-19
  • 打赏
  • 举报
回复
还需要考虑的几个问题:
1.客户端可能经常不能连接Internet。
只是传文件的时候,才连接到Internet.所以经常不能连接Internet应该没什么影响,只是要做好防错处理.因为即使不能连接Internet,你的文件还是照样产生在Client下面.不会受影响.
2.文件上传好像也有几种方案,应该如何选择。
如何选择,看你自己了.你可以如上转换成流传,也可以直接整个文件传.
3.文件在上传的过程中失败,是否要考虑断点续传的问题。
因为你的单个文件不是很大.都是些文本,基本上不用考虑这个问题.
wangin8181 2006-06-19
  • 打赏
  • 举报
回复
非常感谢狼呀.因为不能连续发三次以上的回复,所以叫他帮忙顶了下哈.

以上方法仅供参考.是转摘的.你可以依据需要参考.
3.利用Timer控件定时让Windows Service从Web服务器获取信息写到Client.
实现Windows Service自动更新.有一种方法可以用.不算最好的,不过是可行的.
你的Windows Service执行的功能操作写成一个dll.然后每次执行操作的时候是利用反射去动态加载执行的.
那么更新的话就可以直接从固定路径根据比对程序集的版本等.其他方法来判断是否有最新的程序集下载来更新.
海边的狼 2006-06-19
  • 打赏
  • 举报
回复
wangin8181 2006-06-19
  • 打赏
  • 举报
回复
/// <summary>
///上传文件并返回服务器上的文件名
/// </summary>
/// <param name="bytes">字节流</param>
/// <param name="fileName">客户端的文件名</param>
///<param name="optFilePath">文件存放的服务器路径</param>
/// <returns>服务器上的文件名</returns>
[AutoComplete]
public string LoadupFile(byte[] bytes, string fileName, ICMS.EnmOption optFilePath)
{
BS.SystemManage.Option option=new BS.SystemManage.Option();
string uriString = @option.OptionVal(optFilePath);
if(uriString.EndsWith("\\") == false) uriString = uriString + "\\";
string fileNameExt = fileName.Substring(fileName.LastIndexOf(".") + 1);
DateTime dt = DateTime.Now;
string strDateTime = dt.ToString("yyMMddHHmmss");
string strMilsecond = dt.Millisecond.ToString();
fileName = strDateTime + strMilsecond + "." + fileNameExt;
uriString = uriString + fileName;

try
{
WebClient myWebClient = new WebClient();
myWebClient.Credentials = CredentialCache.DefaultCredentials;

Stream postStream = myWebClient.OpenWrite(uriString,"PUT");
if(postStream.CanWrite)
{
postStream.Write(bytes,0,bytes.Length);
}
else
{
throw new Exception("文件目前不可写.");
}
postStream.Close();
}
catch(WebException we)
{
throw new Exception(we.Message);
}
return fileName;
}

/// <summary>
///文件下载转成字节流
/// </summary>
/// <param name="fileName">服务器上的文件名</param>
/// <param name="optFilePath">文件存放的服务器路径</param>
/// <returns>字节流</returns>
[AutoComplete]
public byte[] DownLoadFile(string fileName, ICMS.EnmOption optFilePath)
{
BS.SystemManage.Option option=new BS.SystemManage.Option();
string uriString = @option.OptionVal(optFilePath);
string fileFullName = uriString + "\\" + fileName.Trim();
if(!File.Exists(fileFullName))
{
return null;
}
else
{
// 得到服务器上要下载的文件流
FileStream fs = new FileStream(fileFullName, FileMode.Open, FileAccess.Read);
BinaryReader r = new BinaryReader(fs);
byte[] postArray = r.ReadBytes((int)fs.Length);
return postArray;
}
}
wangin8181 2006-06-19
  • 打赏
  • 举报
回复
2.FileSystemWatcher.可以在1里面建立的Windows Service里面添加一个Timer控件来实现.在Timer控件的事件里面去写监控文件夹处理.其实传文件有很多种.你可以直接用WebClient传.也可以如下例子.转成字节数组.那么你想怎么加密都行.比如你可以在字节数组前后添加自己的头和尾标志字节,哈.然后用简单的调用方法传参传到服务器上.如果服务器是WebService.你可以异步调用执行.通过Callback,就是执行成功.就删除本地Txt文件.当然文件传到了WEB服务器就可以很简单的恢复为原来的文件.
public static byte[] File2Bytes(string filePath)
{
if(filePath.Trim() == String.Empty)
{
MessageBox.Show("路径有误,请查证!","错误:", MessageBoxButtons.OK,
MessageBoxIcon.Information);
return null;
}
else
{
/// 得到文件名,文件扩展名字
string fileNamePath = filePath.Trim();
string fileName = fileNamePath.Substring(fileNamePath.LastIndexOf("\\") + 1);

// 要上传的文件
FileStream fs = new FileStream(fileName, FileMode.Open, FileAccess.Read);
BinaryReader r = new BinaryReader(fs);
byte[] postArray = r.ReadBytes((int)fs.Length);
return postArray;

}
wangin8181 2006-06-19
  • 打赏
  • 举报
回复
哈哈...刚来,昨天休息,不好意思.
想了下,建议呀.
1.创建Windows Service.打开VS2005.选择新建项目,然后选择Windows Service就可以创建一个Windows Service.
你可以创建一个Windows Service.设置它是自动启动的.那么它开机就会自动启动,当然安全模式就不会.
基本上,我想应该满足你的要求.因为大部分的软件是这么做的.
摘自MSDN:
若要创建功能性服务,必须至少:
设置 ServiceName 属性。
为服务应用程序创建必需的安装程序。
重写 OnStart 和 OnStop 方法并为其指定代码,以对服务的行为方式进行自定义。
创建 Windows 服务应用程序
创建一个“Windows 服务”项目。

注意
有关不使用模板编写服务的说明,请参见如何:以编程方式编写服务。


在“属性”窗口中,设置服务的 ServiceName 属性。
注意
ServiceName 属性的值必须始终与安装程序类中记录的名称匹配。如果更改此属性,则必须也更新安装程序类的

ServiceName 属性。
设置下列所有属性以确定服务的工作机制。
属性 设置
CanStop
True 指示服务将接受停止运行的请求;false 指示禁止停止运行服务。
CanShutdown
True 指示服务希望在运行该服务的计算机关闭时收到通知,以便能够调用 OnShutdown 过程。
CanPauseAndContinue
True 指示服务将接受暂停或继续运行的请求;false 指示禁止服务暂停运行和继续运行。
CanHandlePowerEvent
True 指示服务可以处理有关计算机电源状态更改的通知;false 指示禁止服务得到有关这些更改的通知。
AutoLog
True 表示在服务执行操作时将信息项写入应用程序的事件日志;false 表示禁用此功能。有关更多信息,请参见如何:记

录关于服务的信息。
注意
默认情况下,AutoLog 设置为 true。
注意
当 CanStop或 CanPauseAndContinue设置为 false 时,“服务控制管理器”会禁用相应的停止、暂停或继续服务的菜单选项


访问代码编辑器,并为 OnStart 和 OnStop 过程填写所需的处理。
重写其他所有要为其定义功能的方法。
添加服务应用程序所必需的安装程序。有关更多信息,请参见如何:将安装程序添加到服务应用程序。
通过从“生成”菜单中选择“生成解决方案”来生成项目。
注意
不要通过按 F5 来运行项目,不能以这种方式运行服务项目。
安装服务。有关更多信息,请参见如何:安装和卸载服务。
zeusvenus 2006-06-18
  • 打赏
  • 举报
回复
你的Windows服务要永远运行很难做到,受操作系统调度的服务不保险

简易楼主做个Web服务隔段时间去获取这个文本文件然后再去处理比较方便一些。
代码蜗牛sky 2006-06-18
  • 打赏
  • 举报
回复
http://e65.sogot.com/Pages/UploadHelper.aspx

可以考虑一下上面那个组件,可以直接和作者联系,以前用过一下,还可以
Knight94 2006-06-18
  • 打赏
  • 举报
回复
to 在客户端上传文件用"FtpWebResponse"是不是比较高效和安全?

要想高效和安全,你直接用ftp去上传文件
  • 打赏
  • 举报
回复
在客户端上传文件用"FtpWebResponse"是不是比较高效和安全?
erental 2006-06-18
  • 打赏
  • 举报
回复
mark
  • 打赏
  • 举报
回复
刚才的问题已经处理好了,FTP服务器没有写的权限。

问题:这样是否安全?如果使用EnableSsl = true;还需要注意什么?
wmhnq 2006-06-18
  • 打赏
  • 举报
回复
这种情况明显用socket来做要好很多
加载更多回复(16)

110,549

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧