【发布时间】:2018-05-17 07:17:18
【问题描述】:
我在 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 服务和桌面应用程序之间通过命名管道进行的通信有什么特别之处吗?这甚至可能吗?
【问题讨论】:
-
这很像一个安全问题。默认情况下,运行 Windows 服务的用户帐户是 LocalService,它几乎没有权限并且可能无法将命名管道连接到任何东西。尝试在您自己的帐户下启动该服务,我想您会看到它有效。必须小心地为 Windows 服务找到合适的帐户来运行,否则您将打开一个安全漏洞。
-
@AQuirky 除了这个问题,我已经使用启动 WPF 应用程序的同一帐户运行它。没有成功。
-
好的。我完全按照您在此处显示的那样编写了一个 Windows 服务和一个 WPF 客户端,即使在默认的 LocalService 帐户下也可以正常工作。所以我觉得问题出在你实现服务的方式上。我做了绝对最低限度的工作:在 OnStart 的新线程上创建的服务循环。建立连接后的服务循环连续循环,延迟1秒发送“测试”,一切正常。
-
@AQuirky 非常感谢您的测试。明天我将尝试设置一个新服务并从头开始。
-
@AQuirky 不幸的是我没有运气。您是否为您的服务创建了 ProjectInstaller?你的设置是什么?您使用的是哪个 .NET 版本?
标签: c# wpf wcf named-pipes