1

我对 WCF NetNamedPipeBinding 有疑问。当我在 Windows XP 机器上通过 Visual Studio 2008 运行我的服务器和客户端代码时,一切正常。但是,一旦我将服务器部署为 Windows 服务并在 Windows Server 2008 中安装我的客户端应用程序,每当我尝试使用任何合同方法时,我都会在客户端收到 TimeoutException。看来我可以成功创建客户端并打开它,但无法调用任何方法。

服务初始化代码:

Uri baseAddress = new Uri("http://localhost:8500/xNet/xNetService");
string address = "net.pipe://localhost/xNet/xNetService";

_xNetAPIServiceHost = new ServiceHost(typeof(xNetService), baseAddress);

NetNamedPipeBinding binding = new NetNamedPipeBinding(NetNamedPipeSecurityMode.None);
_xNetAPIServiceHost.AddServiceEndpoint(typeof(IServiceAPI), binding, address);

// Add a mex endpoint
ServiceMetadataBehavior smb = new ServiceMetadataBehavior();
smb.HttpGetEnabled = true;
smb.HttpGetUrl = new Uri("http://localhost:8501/xNet/xNetService/mex");
_xNetAPIServiceHost.Description.Behaviors.Add(smb);

_xNetAPIServiceHost.Open();

客户端初始化代码:

string address = "net.pipe://localhost/xNet/xNetService";

NetNamedPipeBinding binding = new NetNamedPipeBinding(NetNamedPipeSecurityMode.None);

_serviceClient = new ServiceAPIClient(binding, new EndpointAddress(address));
_serviceClient.Open();

Windows 服务作为“本地系统帐户”运行。我不知道问题出在哪里。不知道是不是安全账户的问题,还是命名管道是否打开了?我假设因为我可以成功创建并打开客户端,所以它至少会找到命名管道。如果没有 TimeoutException,我就无法调用任何服务方法。

4

1 回答 1

0

在尝试了各种绑定并回到基础之后,我注意到示例程序可以工作,但我的程序没有工作,除非我使用 Visual Studio 进行调试。那时我决定这一定是我自己的代码发生的事情。为了简化调试,我关闭了绑定中的所有安全性。

我开始注释掉我服务的 OnStart 方法中的大部分语句,以确定可能发生的情况。我注释掉了除了初始化 ServiceHost 的代码之外的所有内容。神奇的是,我的客户现在可以成功地与服务通信。然后我开始取消注释 OnStart 方法中的每一行代码,直到我的客户突然再次开始给我一个 TimeoutException。

我的服务类,比如“MyAPI”,实现了合同“IMyAPI”。除了使用“MyAPI”类作为 WCF 服务之外,我还在我的服务内部使用“MyAPI”类的一个实例来做各种事情(“内部”方法)。在我的 OnStart 方法中,我首先创建了“MyAPI”类的一个实例,然后创建了 ServiceHost:

MyAPI API = new MyAPI();

ServiceHost service = new ServiceHost(typeof(MyAPI));

我没有收到任何错误或异常,所以看起来一切都很好,但实际上我无法使用客户端连接到服务。一旦我改变了上述语句的顺序,客户端又开始工作了:

ServiceHost service = new ServiceHost(typeof(MyAPI));

MyAPI API = new MyAPI();

我不确定为什么会发生这种情况,我所知道的是我可以在内部使用我的 API 并作为服务使用,而不会出现任何客户端连接问题。也许有人会提供一些说明这背后的原因,或者我的代码可能没有正确设计。

于 2011-12-20T06:54:53.797 回答