WCF 发现 .NET 4:配置/编程定义问题
本文关键字:编程 定义 问题 配置 发现 NET WCF | 更新日期: 2023-09-27 17:57:14
我有一个启用了发现的 WCF 服务,现在我想将客户端连接到它。
问题:当我使用 udp 端点 ( 1. ) 并尝试以编程方式发现服务时,它可以工作...当我使用 App.config 方法 ( 2. ) 时,它不会(错误:未发现端点)。
对我来说,似乎两种解决方案的"udp 发现结果"应该是相同的,但不幸的是它不是......
1. 以编程方式(作品):
法典:
DiscoveryClient discClient = new DiscoveryClient("udpDiscoveryEndpoint");
FindCriteria fCriteria = new FindCriteria(typeof(IAlarmServer));
fCriteria.Duration = TimeSpan.FromSeconds(5);
fCriteria.MaxResults = 1;
FindResponse fResponse = discClient.Find(fCriteria);
EndpointAddress address = fResponse.Endpoints[0].Address;
Console.WriteLine("Address found: " + address.ToString());
配置:
<system.serviceModel>
<client>
<endpoint name="udpDiscoveryEndpoint" kind="udpDiscoveryEndpoint" />
</client>
</system.serviceModel>
2. 使用 App.config 和"集成到端点"方法的方法(不起作用!
法典:
var Proxy = new AlarmServerClient("IAlarmServer"); // Default client generated by Visual Studio
Proxy.SomeMethod(); // throw no endpoints discovered exception
配置:
<standardEndpoints>
<dynamicEndpoint>
<standardEndpoint name="discoveryDynamicEndpointConfiguration">
<discoveryClientSettings>
<findCriteria duration="00:00:05" maxResults="1">
<types>
<add name="AlarmServiceRef.IAlarmServer"/>
</types>
</findCriteria>
<endpoint kind="udpDiscoveryEndpoint"/>
</discoveryClientSettings>
</standardEndpoint>
</dynamicEndpoint>
</standardEndpoints>
配置:
<client>
<endpoint binding="basicHttpBinding" bindingConfiguration="DefaultBasicHttpBinding" contract="AlarmServiceRef.IAlarmServer" name="IAlarmServer"
kind="dynamicEndpoint"
endpointConfiguration="discoveryDynamicEndpointConfiguration"/>
</client>
知道为什么会这样吗?
通过 IIS 托管具有发现功能的服务时的几件事
- 在服务配置中,确保服务名称与包含命名空间的类名
- 您必须确保服务正在运行,然后才能发现它与客户端。您可以手动浏览到服务的 .svc 文件或使用 AppFabric 托管服务并将"自动启动"设置为 true(您也可以在 web.config 中指定)
- 在服务配置中,您必须发出所需的类型在客户端上的查找条件中使用
下面是设置服务终结点的服务器配置示例。请注意,服务"name"属性是实现服务的类的完整命名空间。
服务配置
<services>
<service name="WcfDiscovery.Services.BuzzerService" behaviorConfiguration="sb1" >
<endpoint binding="basicHttpBinding" contract="WcfDiscovery.Contracts.IAlarmServer" address="" behaviorConfiguration="eb1" />
<endpoint kind="udpDiscoveryEndpoint" />
</service>
</services>
还要确保将发现行为添加到服务中
服务配置
<serviceBehaviors>
<behavior name="sb1">
<serviceMetadata httpGetEnabled="true"/>
<serviceDebug includeExceptionDetailInFaults="false"/>
<serviceDiscovery />
</behavior>
</serviceBehaviors>
由于我希望客户端能够按类型(WcfDiscovery.Contracts.IAlarmServer)发现服务,因此我还必须在端点的行为配置中指定(eb1)
服务配置
<endpointBehaviors>
<behavior name="eb1">
<endpointDiscovery enabled="true">
<types>
<add name="WcfDiscovery.Contracts.IAlarmServer" />
</types>
</endpointDiscovery>
</behavior>
</endpointBehaviors>
现在在客户端,我可以使用findCriteria发现服务。请注意,查找条件中的类型必须与服务发出的类型匹配(在服务类型列表中)
客户端配置
<standardEndpoints>
<dynamicEndpoint>
<standardEndpoint name="dynamicEndpointConfiguration">
<discoveryClientSettings >
<endpoint kind="udpDiscoveryEndpoint" />
<findCriteria maxResults="2">
<types>
<add name="WcfDiscovery.Contracts.IAlarmServer" />
</types>
</findCriteria>
</discoveryClientSettings>
</standardEndpoint>
</dynamicEndpoint>
</standardEndpoints>
下面是客户端终结点配置
客户端配置
<client>
<endpoint kind="dynamicEndpoint" name="endpoint" binding="basicHttpBinding" contract="WcfDiscovery.Contracts.IAlarmServer" endpointConfiguration="dynamicEndpointConfiguration" />
</client>
最后,我可以在控制台应用程序中发现该服务,如下所示:
ChannelFactory<IAlarmServer> factory = new ChannelFactory<IAlarmServer>("endpoint");
var proxy = factory.CreateChannel();
Console.WriteLine(proxy.SoundAlarm());
希望这有帮助!
不能只向客户端项目添加服务引用吗?它将为您生成配置。