WCF 客户端作为控制台应用程序工作,但作为 Windows 服务运行,失败并出现 EndpointNotFoundException

WCF client works as console application but running as Windows service, fails with EndpointNotFoundException

提问人:user1389890 提问时间:7/28/2018 最后编辑:user1389890 更新时间:7/29/2018 访问量:323

问:

我编写了一个 C# 控制台应用程序,以使用 NetNamedPipeBinding 使用本地 WCF 服务。我使用的 WCF 服务作为本地 Windows 应用程序运行。我的 WCF 客户端作为控制台应用程序工作正常。但是,当我实现本质上相同的 WCF 客户端时,不是作为控制台应用程序,而是作为 Windows 服务,我的 WCF 客户端找不到本地 WCF 终结点并引发 System.ServiceModel.EndpointNotFoundException 异常。

为什么 WCF 客户端作为控制台应用程序运行良好,然后在客户端作为 Windows 服务运行时引发 EndpointNotFoundException?

这是我在客户端代码中创建通道工厂的方式:

// Define some local variables needed to create the channel factory
string strendpoint = string.Format("net.pipe://localhost/{0}", BluehillAPIService.ServiceName);
EndpointAddress endpoint = new EndpointAddress(strendpoint);
NetNamedPipeBinding binding = new NetNamedPipeBinding();
InstanceContext instanceContact = new InstanceContext(this);

// Create the channel factory
ChannelFactory = new DuplexChannelFactory<IBluehillAPIService>(instanceContact, binding, endpoint);

然后我像这样创建频道:

_bluehillAPIService = ChannelFactory.CreateChannel();

到目前为止没有错误,但是当我尝试按如下方式实际使用该频道时,我得到一个异常:

if (!_bluehillAPIService.APIHeartbeat()) ...

当此代码作为以本地系统身份登录的 Windows 服务运行时,WCF 客户端中对 _bluehillAPIService.APIHeartbeat() 的调用会生成 System.ServiceModel.EndpointNotFoundException,但当基本相同的代码作为控制台应用程序运行时,此代码可以正常工作。

WCF Windows 服务 WCF 客户端 NetNamedPipeBinding EndpointNotFoundException

评论


答:

0赞 CoreTech 7/29/2018 #1

由于 LocalSystem 帐户在访问网络资源时会提供匿名凭据,因此在该上下文中运行的网络应用程序可能无法按预期运行。

在服务的“登录”选项卡上指定一个适当的帐户 -- 您可以在其中登录并运行应用程序而不会出错的帐户:

enter image description here

评论

0赞 user1389890 7/30/2018
谢谢!这是有道理的。我会尝试一下。