RO41 –
修改标准的
.NET
事件处理支持
RemObjects SDK
本文描述如何将一个标准的
c#
应用程序转换为
RemObjects SDK (
简称
RO)
服务
.
在此基础上可以轻松的在你的机器上运行一个客户端连接到服务读取数据
.
本文主要提供如下内容
:
- 本地应用程序: 描述将要更改的应用程序
- 如何转换:需要做的工作
- 接下来做什么?: 一些有用的参考
本地应用程序
为了简单
,
我们使用一个可以从特定目录中取得文件列表的应用程序
.
我们的所有逻辑都在
FS
类中
.
这里我们有一个
FSItem
结构
,
可以获取文件或目录信息
:
public class
FSItem
{
private bool
_isFolder;
private string
_name;
public long
_size;
public bool
IsFolder
{
get { return _isFolder; }
set { _isFolder = value; }
}
public string
Name
{
get { return _name; }
set { _name = value; }
}
public long
Size
{
get { return _size; }
set { _size = value; }
}
}
其中也包含新的方法
: getFolders, getFiles
和
getFoldersAndFiles.
每个方法都可以读取目录并返回一个
FSItem
对象集合
.
这里是
getFiles
的实现
:
public static
FSItem[] getFiles(string folderName)
{
System.Collections.ArrayList res = new System.Collections.ArrayList();
DirectoryInfo di = new DirectoryInfo(folderName);
if
(!di.Exists) return new FSItem[
0
];
#region Get Files...
FileInfo[] files = di.GetFiles();
for
(int i =
0
; i < files.Length; i++)
{
FSItem item = new FSItem();
item.IsFolder = false;
item.Name = files[i].FullName;
item.Size = files[i].Length;
res.Add(item);
}
#endregion
return
(res.ToArray(typeof(FSItem)) as FSItem[]);
}
我们的主窗体可以调用这些方法并在控件中显示数据
:
private void
btnGetFiles_Click(object sender, System.EventArgs e)
{
listBox1.Items.Clear();
FS.FSItem[] items = FS.getFiles(@
"C:/");
for
(int i =
0
; i < items.Length; i++)
listBox1.Items.Add(items[i].Name);
}
用户界面如图
:
如何转换
转换这样的应用程序到
RO
需要如下步骤
:
1)
基于
RO WindowsFormsServer
模板创建一个项目
:
2)
做如下配置
:
3)
打开
Service Builder
并加入保存文件信息的结构
:
4)
增加一个
FSItem
的数组结构
:
5)
现在我们设置创建服务方法
.
我们创建三个方法
: getFolders, getFiles
和
getFoldersAndFiles.
它们需要
folderName (string)
参数并返回我们定义的
FSItem
数组
:
6)
验证我们的库
(
点击
Validate
按钮
)
如果一切
OK,
关闭它
.
接口创建完毕
.
7)
现在打开
ROGetFilesService_Impl.cs
文件并实现我们的方法
.
注意我们只需要在第一个应用程序中将其中的函数实现拷贝过来或做少许修改即可
.
例如
, getFiles
方法的实现是完全相同的
.
8)
最后在客户端调用服务
.
我们到客户端的主窗体做如下修改
:
...
private
ROGetFiles.IROGetFilesService service;
public
Form1()
{
InitializeComponent();
service = ROGetFiles.CoROGetFilesService.Create(message, clientChannel);
}
private void
btnGetFiles_Click(object sender, System.EventArgs e)
{
listBox1.Items.Clear();
ROGetFiles.FSItem[] items = service.getFiles(@
"C:/");
for
(int i =
0
; i < items.Length; i++)
listBox1.Items.Add(items[i].Name);
}
...
现在我们拥有的
RO
服务端和客户端运行如下
:
最后我们需要配置客户端通道连接到远程计算机
.
配置依赖于我们使用的不同客户端通道类型
:
- IpHttpClientChannel或WinInetHttpClientChannel:设置TargetUrl 属性为http://[ServerHostName]:[Port]/[Dispatcher] (如 "http://MyServer1:8099/bin")
- IpTcpClientChannel或 SuperTcpClientChannel:设置Hostname(主机命)和Port(端口)属性.
现在我们启动客户端并连接到运行在其它计算机上的服务
.
从而我们也可以获取远程机器的文件系统及其文件列表
(
当然服从文件访问许可
).
接下来做什么
?
本文中我们介绍了非常简单的范例
.
你可以在
RemObjects SDK
自带的范例中找到更繁琐的
FileTransfer
范例
.
这里也是使用同样的方式
,
范例支持对远程文件系统的导航并可以在客户端下载任意文件
.