我在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应用程序以管理员身份运行时才有效仍然是个谜。