如何从GUI访问服务

时间:2013-08-07 20:01:44

标签: c# visual-studio-2010 service

我有一个程序,用于从联网计算机收集文件并将它们存储到本地目录。这是每小时完成的,我希望将它变成一个将在后台运行的服务,但是有一个运行的小应用程序,它会生成一个系统托盘图标,这个图标将允许用户打开一个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()?

2 个答案:

答案 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是一篇精彩的文章,可以准确描述您的需求。