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

问题描述 投票:0回答:2

我在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服务和桌面应用程序之间的通信有什么特别之处吗?这甚至可能吗?

c# wpf wcf named-pipes
2个回答
1
投票

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


0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.