Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/wcf/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
WCF发现和数据服务V3_Wcf_Wcf Data Services_Service Discovery_Wcf Data Services Client_Wcf Discovery - Fatal编程技术网

WCF发现和数据服务V3

WCF发现和数据服务V3,wcf,wcf-data-services,service-discovery,wcf-data-services-client,wcf-discovery,Wcf,Wcf Data Services,Service Discovery,Wcf Data Services Client,Wcf Discovery,我想为我的Data Services v3公开发现端点(TCP和UDP),并使服务能够从客户端发现,并在另一个应用程序中发现它们。发现的要点是在客户端获取服务端点地址 我曾尝试调整Microsoft为WCF发现提供的示例,但到目前为止,我未能实现我的目标。 我已在服务器端创建了自定义数据服务主机工厂: 在客户端,我尝试了以下代码: DiscoveryClient discoveryClient = new DiscoveryClient(new UdpDiscoveryEndpoint());

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

我曾尝试调整Microsoft为WCF发现提供的示例,但到目前为止,我未能实现我的目标。 我已在服务器端创建了自定义数据服务主机工厂:

在客户端,我尝试了以下代码:

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();
    }
}
不幸的是,这不起作用。我得到了无效操作异常:

试图获取DataModel的协定类型,但该类型无效 不是ServiceContract,也不继承ServiceContract

如果我正朝着正确的方向前进,我需要一种方式来表示发现服务契约的类型。太糟糕了,我不确定它是否会像普通的WCF发现一样工作


请分享您的想法或更好的解决方案。

我认为异常信息已经足够清楚了。 对于服务发现,您尝试使用数据模型的类型,而必须使用WCF服务实现的类型—这是不同的

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

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();
    }
}