我有一个程序,用于从联网计算机收集文件并将它们存储到本地目录。这是每小时完成的,我希望将它变成一个将在后台运行的服务,但是有一个运行的小应用程序,它会生成一个系统托盘图标,这个图标将允许用户打开一个GUI,他们可以在这里修改位置保存文件和从中检索文件的位置,以及为用户定义的dateTime范围手动收集文件。我很好奇,如果GUI只是一个前端,并且所有“繁重”方法都在服务中完成,我如何从GUI访问这些服务功能? 例如,如果以下是我的服务(非常粗略的版本):
partial class RemoteArchiveService : ServiceBase
{
...
...
string destination;
string retrieveFrom;
List<string> fileNames;
public void ChangeCollectFrom(string filepath){...}
public void ChangeDestinationFolder(string filepath){...}
public void GetFilesAsynchronously(){...}
...
...
}
GUI代码中的如何使用新的用户输入字符串访问函数ChangeCollectionFrom()?
答案 0 :(得分:2)
查看WCF并使您的GUI成为调用该服务的客户端。一个好的起点是http://msdn.microsoft.com/en-us/library/ms733069.aspx
WCF将允许您通过在现有Windows服务中托管WCF服务,干净简洁地指定客户端需要访问的方法。例如,您可以执行以下操作:
[ServiceContract(Namespace = "http://Somewhere.StackOverflow.Samples")]
public interface IRemoteArchive
{
[OperationContract]
void ChangeCollectionFrom(string filepath);
}
partial class RemoteArchiveWCFService : IRemoteArchive
{
public void ChangeCollectionFrom(string filepath)
{
// ...
}
}
然后在RemoteArchiveService的其他地方(从上面的链接中获取的代码段)
partial class RemoteArchiveService : ServiceBase
{
// ...
protected override void OnStart(string[] args)
{
if (serviceHost != null)
{
serviceHost.Close();
}
serviceHost = new ServiceHost(typeof(RemoteArchiveWCFService));
// Open the ServiceHostBase to create listeners and start
// listening for messages.
serviceHost.Open();
}
// ...
}
答案 1 :(得分:0)
如今,大多数服务都公开了用于配置和管理的Web UI,如Oracle,支持网络的打印机等,因此我建议您利用Web UI实现目的,而幸福的消息是它并不是很困难。
Nancy是一个轻量级,低仪式的框架,用于在.Net和Mono上构建基于HTTP的服务,可以通过这种方式为您提供帮助。
此外,Build Simple Web UIs with the Nancy Framework是一篇精彩的文章,可以准确描述您的需求。