在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 服务