如何使用 WCF 在 Windows 服务和 Windows 窗体之间进行通信?

Posted

技术标签:

【中文标题】如何使用 WCF 在 Windows 服务和 Windows 窗体之间进行通信?【英文标题】:How to communicate between a windows service and windows form with a WCF? 【发布时间】:2020-02-19 12:45:26 【问题描述】:

我有一个 超时 在此超时之后我有一个使用 WCF 在 Windows 服务和 Windows 窗体之间发送消息。

我已经可以从 windows 窗体向 windows 服务发送消息了:

WCF

public class Interact : IInteract
    
        private Func<string, int> callback;

        public Interact(Func<string, int> callback)
        
            this.callback = callback;
        

        public void SendRequest(string name)
        
            var output = this.callback(name + " callback");
        

        public string AskIfAlive()
        
            return "ask";
        

    

服务窗口

public partial class LMService : ServiceBase

    private ServiceHost host;

    public LMService()
    
        InitializeComponent();
    

    protected override void OnStart(string[] args)
    
        Class1.Init();

        Interact instance = new Interact(ReceiveMsg);
        host = new ServiceHost(instance);
        host.Open();

    

    private int ReceiveMsg(string data)
    
        // Message from Windows form to windows service
        Log.writeEventLog(data);
        return 1;
    

定时器

public static class Class1

    static int Timeout = 0;
    static Timer tm = new Timer();

    public static void Init()
    
        tm.Interval = 1000;
        tm.Elapsed += Tm_Elapsed;
        tm.Start();
    

    private static void Tm_Elapsed(object sender, ElapsedEventArgs e)
    
        Timeout++;
        if(Timeout >= 10)
        
            // SEND MESSAGE TO WINDOWS FORM
            tm.Stop();
        
    


我想在 windows 服务超时后向 windows 窗体发送一些东西,但我不知道该怎么做,有人可以帮助我吗?

【问题讨论】:

【参考方案1】:

您可以使用 双工服务 以允许该服务也将消息发送到 Windows 窗体应用程序。 有关详细信息和示例,请参阅此link。

双工服务是一种 WCF 服务,它接收可用于向客户端发送消息的回调。除了服务契约,还需要创建服务使用的回调契约。

请注意,回调与 WCF 操作上下文相关联。您可能需要将示例的静态 Init 方法更改为实例方法,并为每个调用/客户端创建一个新的 Class1 实例。

【讨论】:

我不确定我是否理解,但我会试试你的样品,谢谢你的帮助。 我试了一下,但我无法启动我的服务。我的服务总是停止,我无法对其进行测试。 @user10863293 你需要调试你的服务启动。有关详细信息,请参阅此链接:docs.microsoft.com/en-us/visualstudio/debugger/…希望这会有所帮助。【参考方案2】:

我们设计的服务是双工还是请求/响应模型。服务的发起者是客户端,因此我们应该将服务托管在 Windows 窗体应用程序中,而不是 Windows NT 服务。 此外,您的 Windows NT 服务似乎向 Windows 窗体应用程序发送了一次消息。因此,我认为没有必要使用双工服务。 关于双工服务,我曾经做过一个例子。希望对你有用。TimeOut exception in WCF while implementing duplex 如果有什么可以帮助的,请随时告诉我。

【讨论】:

感谢您的帮助,我会看到您的示例。我只是向你解释我的交换,所以客户端会向 Windows 服务询问一些东西来工作,所以如果它工作,服务会发送一些东西,并且每 10 分钟服务器会询问客户端是否工作,客户端会回答一些问题。 我创建了一个新项目,我只是复制并粘贴您的示例,但出现错误:System.ServiceModel.AddressAccessDeniedException: 'HTTP could not register URL http://+:3333/.您的进程无权访问此命名空间(有关详细信息,请参阅go.microsoft.com/fwlink/?LinkId=70353)。' 因为机器端口占用是由操作系统驱动程序Http.SYS组件管理的。它需要操作系统将端口的权限分配给该用户。我们只需使用管理员帐户运行控制台应用程序即可解决此问题。此外,如果服务器端和客户端不是同一台计算机,我们应该在客户端提供身份验证凭据。 factory.Credentials.Windows.ClientCredential.UserName = "Serverwindowsuser"; factory.Credentials.Windows.ClientCredential.Password="123456":如果有什么我可以帮忙的,请随时告诉我。 此外,我不明白如何使用 Windows 服务的双工我可以要求客户端执行操作

以上是关于如何使用 WCF 在 Windows 服务和 Windows 窗体之间进行通信?的主要内容,如果未能解决你的问题,请参考以下文章

如何在虚拟机中使用托管在 Windows 服务中的 WCF

使用单个 Windows 服务托管 4 个不同的 WCF 项目。如何?

如何在windows服务中寄宿wcf服务的例子

如何在 ajax 客户端中使用作为 Windows 服务运行的 wcf 服务

如何对 Windows 服务中托管的 wcf 服务进行负载/压力测试?

Windows 服务(托管 WCF 服务)在启动时立即停止