我想为我的Data Services v3公开发现 endpoints (包括TCP和UDP),并允许从客户端发现服务并在另一个应用程序中发现它们 . 发现的要点是在客户端获取服务 endpoints 地址 .
我试图调整Microsoft为WCF Discovery提供的示例,但到目前为止,我未能实现我的目标 . 我在服务器端创建了一个自定义数据服务主机工厂:
public class CustomDataServiceHostFactory : System.Data.Services.DataServiceHostFactory
{
protected override System.ServiceModel.ServiceHost CreateServiceHost(Type serviceType, Uri[] baseAddresses)
{
var serviceHost = base.CreateServiceHost(serviceType, baseAddresses);
EndpointDiscoveryBehavior endpointDiscoveryBehavior = new EndpointDiscoveryBehavior();
// Create XML metadata to add to the service endpoint
XElement endpointMetadata = new XElement(
"Root",
new XElement("Information", "This endpoint is Data Service v3!"),
new XElement("Time", System.DateTime.Now.ToString("MM/dd/yyyy HH:mm")));
// Add the XML metadata to the endpoint discovery behavior.
endpointDiscoveryBehavior.Extensions.Add(endpointMetadata);
//may be this is not the safest way to set the behaviour
foreach (var endpoint in serviceHost.Description.Endpoints)
{
endpoint.Behaviors.Add(endpointDiscoveryBehavior);
}
// Make the service discoverable over UDP multicast
serviceHost.Description.Behaviors.Add(new ServiceDiscoveryBehavior());
serviceHost.AddServiceEndpoint(new UdpDiscoveryEndpoint());
return serviceHost;
}
}
在客户端,我尝试了以下代码:
DiscoveryClient discoveryClient = new DiscoveryClient(new UdpDiscoveryEndpoint());
// Find service endpoints
// ServiceReference.DataModel is the generated class for the Data Service client proxy
FindCriteria findCriteria = new FindCriteria(typeof(ServiceReference.DataModel));
findCriteria.Duration = TimeSpan.FromSeconds(30);
FindResponse findResponse = discoveryClient.Find(findCriteria);
// Check to see if endpoints were found & print the XML metadata in them.
if (findResponse.Endpoints.Count > 0)
{
foreach (XElement xElement in findResponse.Endpoints[0].Extensions)
{
Console.WriteLine("Printing Metadata from ServiceEndpoint:");
Console.WriteLine("Endpoint Information: " + xElement.Element("Information").Value);
Console.WriteLine("Endpoint Started at Time: " + xElement.Element("Time").Value);
Console.WriteLine();
}
}
不幸的是,这不起作用 . 我得到InvalidOperationException:
尝试获取DataModel的 Contract 类型,但该类型不是ServiceContract,也不继承ServiceContract .
如果我朝着正确的方向前进,我需要一种方法来表达发现的服务 Contract 的类型 . 太糟糕了我不确定它是否会像普通的WCF发现一样工作......
请分享您的想法,甚至更好 - 工作解决方案 .
1 回答
我认为异常消息足够清楚 . 对于服务发现您尝试使用数据模型的类型,而您必须使用WCF服务实现的类型 - 这是不同的事情 .
基本上,DataServicesV3服务适配器使用您的数据模型,并将其作为WCF服务与其自己的服务 Contract 公开 . 看看DataServiceV3类型声明看到它正在实现一些接口,我只是不记得名字,在这个接口声明中你会发现[ServiceContract]和[ServiceOperation]属性 . 这是DataServiceV3所有祖先的服务 Contract . 他们使用相同的 Contract . 这里还有另一个我还没有解决的问题 - 如果他们共享相同的 Contract ,如何让WS-Discovery与DataServices一起工作 . 你最好以这种方式挖掘 .