从主机 WinForms 程序访问自托管 WCF 服务

Posted

技术标签:

【中文标题】从主机 WinForms 程序访问自托管 WCF 服务【英文标题】:Accessing a Self-Hosted WCF Service From the Host WinForms Program 【发布时间】:2019-01-07 07:22:42 【问题描述】:

我创建了一个 Windows 窗体应用程序来运行 WCF 服务,该服务基本上完全由在同一台机器上运行的单个软件使用,我还希望托管应用程序用作“仪表板”为了透明起见,这将显示有关传入请求的相关状态更新。然而,尽管 Windows 窗体应用程序被用于启动和停止服务,但我无法让它以任何其他有意义的方式与之交互。

一些笔记/我尝试过的:

该服务只能由一个程序访问(可能是托管程序除外) 服务设置为使用 InstanceContextMode.Single,但 ServiceHost 对象的 SingletonInstance 属性始终为空。 向自己的托管服务添加服务引用会导致主机程序无响应(可能并非意外)。

我为含糊而道歉,但我基本上尝试访问服务对象,然后是服务本身。我错过了什么还是有更好的方法来做到这一点?

谢谢,

GBB

编辑:为了清楚起见/我最终得到的解决方案 - 将主机窗口引用设置为服务可访问的主机窗口类的静态成员。

public partial class frmMainWindow : Form

    public static frmMainWindow CurrentInstance;
    ServiceHost serviceHost;        

    public frmMainWindow ()
    
        InitializeComponent();
        CurrentInstance = this;            
    

    void StartService()
    
        // service host stuff here for starting TestServer service
    

    void StopService()
    
        // stop the service
    

    // update the status textbox in the host form
    public void SetStatus(string status)
    
        textStatus.Text = status;
    



[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)]
public class TestServer : ITestServer

    frmMainWindow HostWindow = null;

    public TestServer ()
    
        HostWindow = frmMainWindow .CurrentInstance;
        HostWindow.SetStatus("Service started");
    

【问题讨论】:

总的来说,这不是一个糟糕的问题,但如果没有您的代码和配置,几乎不可能弄清楚。我建议你从头开始学习一些自托管教程,至少得到一些你可以玩的东西。或者,如果您选择,使用客户端和主机的所有相关代码和设置更新此问题。但是我真的会建议选项 A。因为它太宽泛了,不可能知道你做错了什么或错过了什么 很公平 - 我在原始问题中添加了更多内容,包括我根据相关链接找到的解决方案(当然,在提出问题之前我找不到)。 【参考方案1】:

已编辑的原始帖子中概述的解决方案 - 将对主机窗口的引用设置为主机窗口类的静态成员。

【讨论】:

以上是关于从主机 WinForms 程序访问自托管 WCF 服务的主要内容,如果未能解决你的问题,请参考以下文章

将 Miniprofiler 集成到控制台 WCF 自主机

WCF 服务作为 MVC 应用程序的一部分

WPF 应用程序托管 WCF 访问冲突

Mono 中的自托管 WCF 服务

从 Windows 应用程序访问托管在 IIS 上的 WCF 服务时出现问题

WCF 服务 - 自托管服务不起作用