在Windows服务的WPF应用程序中托管的命名管道上使用WCF服务

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在Windows服务的WPF应用程序中托管的命名管道上使用WCF服务相关的知识,希望对你有一定的参考价值。

我在WPF应用程序中托管WCF服务,该服务使用命名管道更新GUI。在Windows服务中,我使用此WCF服务来更新GUI。

我使用以下代码在我的WPF应用程序中托管它:

private ServiceHost serviceHost;

public MainWindow()
{
    InitializeComponent();

    try
    {
        string address = "net.pipe://localhost/Path/ServiceName";
        serviceHost = new ServiceHost(typeof(ComGUIService));
        NetNamedPipeBinding binding = new NetNamedPipeBinding(NetNamedPipeSecurityMode.None);
        serviceHost.AddServiceEndpoint(typeof(IComService), binding, address);
        serviceHost.Open();

    }
    catch (Exception ex)
    {
        // TODO: Logging & Handling
    }
}

并在我的Windows服务中使用它:

string address = "net.pipe://localhost/Path/ServiceName";

NetNamedPipeBinding binding = new NetNamedPipeBinding(NetNamedPipeSecurityMode.None);
EndpointAddress ep = new EndpointAddress(address);

IComService channel =
    ChannelFactory<IComService>.CreateChannel(
        binding, ep
    );

try
{
    channel.SendUpdatedStatus("test");
}
catch (Exception e)
{
    // Throws: The pipe endpoint net.pipe://localhost/... could not be found on your local machine
}

System.IO.PipeException:没有端点监听net.pipe:// localhost / ...可以接受该消息

奇怪的是,完全相同的代码在控制台应用程序中被激活并且与WPF应用程序的通信成功时起作用。通过命名管道,Windows服务和桌面应用程序之间的通信有什么特别之处吗?这甚至可能吗?

答案

我有同样的问题。问题是当您在会话2中作为服务和您的应用程序运行时,您的服务在会话0中运行。您在服务作为控制台运行时看到它正常工作,因为两个应用程序都在同一会话2下运行(不需要额外的权限)。必须在共享内存空间中创建命名管道,以便服务实际查看命名管道,并且当它们运行不同的会话时,您将看到此问题突然出现。解决方案是简单地允许“创建本地对象”权限到必要的用户/组。进入组策略编辑器。 Windows设置 - >安全设置 - >本地策略 - >用户权限分配 - >创建全局对象(将用户组添加到此权限,您应该好好去!)。祝好运!

另一答案

我设法让它运作起来。我唯一要做的就是使用管理权限运行WPF应用程序。为什么这些应用程序之间的通信仅在WPF应用程序以管理员身份运行时才有效仍然是个谜。

以上是关于在Windows服务的WPF应用程序中托管的命名管道上使用WCF服务的主要内容,如果未能解决你的问题,请参考以下文章

Flask 服务器在 Macbook 上托管时可见,但在 Windows 桌面上托管时不可见? (尝试了一切?)[重复]

将 win32 托管到 wpf 在 Windows 7 中不起作用

有没有办法在 Windows 中托管 IDE,但在 linux 上托管源代码和编译(GCC)? [关闭]

使用 Windows 身份验证的 IIS 托管 WCF 服务和 SQL 查询

无法在 Windows 7 上的 Windows 服务中使用 netNamedPipeBinding 托管和启动 WCF 服务

WPF DataBinding 与其他命名空间/类