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

时间:2018-07-28 14:16:40

标签: wcf windows-services wcf-client netnamedpipebinding endpointnotfoundexception

我编写了一个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,但在本质上相同的代码作为控制台应用程序运行时可以正常工作。

1 个答案:

答案 0 :(得分:0)

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

在服务的“登录”标签上指定一个适当的帐户-您可以在该帐户中登录并运行应用程序而不会出现错误:

enter image description here