自托管WCF添加服务引用

3

所以,我创建了WinForms客户端,并将WCF类库添加到解决方案中。

在WinForms中,我执行以下操作:

ServiceHost svc = new ServiceHost(typeof(...), new Uri("net.pipe://localhost/MyNamedPipe")

然后执行svc.Open(),一切运行正常。

现在,我该如何添加服务引用,以便在同一个WinForms中获取WCF的代理?

我只能通过使用ASP.NET开发服务器生成服务引用,而这个服务器是在运行WinForms时启动的,所以我复制了那个URL,停止了调试(开发服务器仍在运行),然后从那里添加了服务引用。但我认为这不正确。

当然,我可以直接引用WCF合同类并使用它,但这也不是正确的方法。

2个回答

4

当您控制两端时,我更喜欢使用ChannelFactory

NetNamedPipeBinding binding = new NetNamedPipeBinding();
EndpointAddress address = new EndpointAddress("net.pipe://localhost/MyNamedPipe");
ChannelFactory<YourInterface> factory = new ChannelFactory<YourInterface>(binding, address);
YourInterface yourInterface = factory.CreateChannel();

因为通过引用自己的服务,你最终只会得到动态生成的重复代码。当你无法轻松访问真正的接口定义时,才需要动态生成的内容。而你已经可以轻松访问它了,所以应该直接使用真实的接口定义。 - Russell McClure
我写了svc = new ServiceHost(typeof(TokenizationService1.TokenizationService), new Uri("net.pipe://localhost/MyNamedPipe")); svc.Open(); ChannelFactory f = new ChannelFactory( new NetNamedPipeBinding(), new EndpointAddress("net.pipe://localhost/MyNamedPipe")); service = f.CreateChannel(); - Nickolodeon
但是当稍后调用service.Tokenize(value)时,我会收到超时异常,显然客户端看不到它。哎呀,这真是困难。 - Nickolodeon
你正在尝试使用WinForms应用程序的主UI线程来调用自身。由于该线程正在等待自己返回消息泵以服务调用,因此会出现超时。这永远不会发生,因此会超时。你需要重新考虑你的设计。从那个服务主机内部尝试调用自己的WCF服务并没有太多意义。 - Russell McClure
不,Russel。那不是问题所在。将serviceMetadata添加到behaviours中解决了它。就像https://dev59.com/aEzSa4cB1Zd3GeqPrP3G中的<behavior name="MyNewBehaviour"> <serviceDebug includeExceptionDetailInFaults="True" /> <serviceMetadata />一样。 - Nickolodeon
但在同一线程上运行也是一个问题,所以我想你是对的。 - Nickolodeon

1

你试过在项目中添加服务引用吗?然后直接在对话框的地址框中输入你的URI吗?

请注意,这应该是完整的URI,例如net.pipe://localhost/MyNamedPipe。

你可以在MSDN 这里找到逐步说明。


我不知道可以这样做。但是当我点击“发现”时,它会在解决方案中为我提供服务,并指定一些http://localhost:3049,尽管我在服务配置中放置了netPipeBinding。 - Nickolodeon
@Nickolodeon:不要点击“发现”,只需输入完整的URI:net.pipe://localhost/MyNamedPipe。 - competent_tech
@Nickolodeon:更新了答案并提供了额外信息。 - competent_tech
我也尝试了那个地址。但是为什么服务引用会找到它——我认为在那个时候管道还没有被创建。服务需要被托管和启动,以便创建管道。但是为了托管它,我需要先生成代理类。这就像一个进退两难的局面。不过让我看看你的链接。 - Nickolodeon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接