0

我想为我的 Data Services v3 公开发现端点(TCP 和 UDP),并使服务可以从客户端发现并在另一个应用程序中发现它们。发现的要点是在客户端获取服务端点地址。

我试图调整 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 的合同类型,但该类型不是 ServiceContract,也不继承 ServiceContract。

如果我朝着正确的方向前进,我需要一种方法来表达发现的服务合同的类型。太糟糕了,我不确定它是否会像正常的 WCF 发现一样工作......

请分享您的想法甚至更好的工作解决方案。

4

1 回答 1

1

我认为异常消息很清楚。对于服务发现,您尝试使用数据模型的类型,而您必须使用 WCF 服务实现的类型 - 这是不同的事情。

基本上 DataServicesV3 服务适配器使用您的数据模型并将其公开为具有自己的服务合同的 WCF 服务。查看 DataServiceV3 类型声明,看到它正在实现一些接口,我只是不记得名称,在这个接口声明中你会发现 [ServiceContract] 和 [ServiceOperation] 属性。这是 DataServiceV3 所有祖先的服务合同。他们使用相同的合同。这是我还没有设法解决的另一个问题——如果它们共享相同的合同,如何使 WS-Discovery 与 DataServices 一起工作。你最好这样挖。

于 2013-06-13T14:13:44.963 回答