C# 如何从GUI访问服务

C# 如何从GUI访问服务,c#,visual-studio-2010,service,C#,Visual Studio 2010,Service,我有一个从联网计算机收集文件并将其存储到本地目录的程序。这是每小时做一次的,我想把它变成一个在后台运行的服务,但是有一个运行的小应用程序,它会生成一个systemtray图标,这个图标允许用户打开一个GUI,在那里他们可以修改保存文件的位置和从中检索文件的位置,以及为用户定义的日期时间范围手动收集文件。我很好奇,如果GUI只是一个前端,所有的“繁重”方法都是在服务中完成的,那么我如何从GUI访问这些服务功能? 例如,如果以下是我的服务(非常粗糙的版本): 部分类RemoteArchiveServ

我有一个从联网计算机收集文件并将其存储到本地目录的程序。这是每小时做一次的,我想把它变成一个在后台运行的服务,但是有一个运行的小应用程序,它会生成一个systemtray图标,这个图标允许用户打开一个GUI,在那里他们可以修改保存文件的位置和从中检索文件的位置,以及为用户定义的日期时间范围手动收集文件。我很好奇,如果GUI只是一个前端,所有的“繁重”方法都是在服务中完成的,那么我如何从GUI访问这些服务功能? 例如,如果以下是我的服务(非常粗糙的版本):

部分类RemoteArchiveService:ServiceBase
{
...
...
字符串目的地;
从中检索字符串;
列出文件名;
公共void ChangeCollectFrom(字符串文件路径){…}
public void ChangeDestinationFolder(字符串文件路径){…}
public void GetFileAsynchronously(){…}
...
...
}

在GUI代码中,如何使用新的用户输入字符串访问函数ChangeCollectionFrom()。

查看WCF并使您的GUI成为调用服务的客户端。一个好的起点是

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中的其他位置(从上面的链接中获取的片段)


如今,大多数服务都公开了一个用于配置和管理的Web UI,如Oracle、支持网络的打印机等,因此我建议您利用Web UI实现自己的目的,令人高兴的是,这并不十分困难

是一个轻量级的、低级的框架,用于在.Net和Mono上构建基于HTTP的服务,可以在这方面帮助您


另外,这是一篇很好的文章,它准确地描述了您想要的功能。

那么,我该如何访问GUI中的功能呢?很抱歉,WCF的内容让我很困惑。在您的示例中,RemoteArchiveWCFService中现在包含的函数是什么,还是这些只是对服务中的函数/方法的引用?我将通过入门教程了解更多有关WCF如何工作和构建客户端的信息。基本上,您的GUI将创建一个WCF服务代理并将其作为服务对象调用,例如,当用户点击保存按钮时,它可以调用代理上的ChangeCollectionFrom方法,该方法将调用该服务。就RemoteArchiveWCFService中的功能而言,你完全可以让你的Windows服务类直接实现这个接口,我只是自己还没有尝试过,也记不起它是否能在我脑海中正常工作。我可能会花上1/2个小时左右的时间来阅读教程,并完全按照上面说的创建计算器服务,然后看看是否可以使用相同的技术使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)
    {
        // ...    
    }
}
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();
    }
    // ...
}