使用WCF OperationContract和DataContracts

时间:2016-04-06 12:51:27

标签: c# visual-studio wcf find-all-references

我正在试图找出是否有办法“查找所有引用”(使用VS功能,而不是Control + F整个解决方案)。当谈到WCF数据和OperationContracts。如果不清楚:

namespace WcfTestReferences
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Hello world");

            DoStuff();

            ServiceReference1.Service1Client client = new ServiceReference1.Service1Client();
            var results = client.GetData(42);

            Console.WriteLine(results);
        }

        static void DoStuff() { }
    }
}

namespace WcfTestReferences.WCFApp
{
    [ServiceContract]
    public interface IService1
    {
        [OperationContract]
        string GetData(int value);
    }

    public class Service1 : IService1
    {
        public string GetData(int value)
        {
            return string.Format("You entered: {0}", value);
        }
    }
}

解决方案如下所示:

enter image description here

现在,如果我用代码镜头查看DoStuff(),我可以看到它实际上有一个参考:

enter image description here

但是对于在wcf服务中调用的方法也是如此:

enter image description here enter image description here

在上面,对接口/方法的唯一引用是接口/方法。我理解我希望的参考文献(来自主要方法):

var results = client.GetData(42);

不存在,因为客户端是生成的,实际上并不是我的Service1实现...但有没有办法改变它?

在现实世界中,我们有一个包含数千种方法的WCF层,其中许多方法未被使用 - 但我不能依赖代码镜头/查找所有引用来做出此决定。有没有办法改变这种行为?

1 个答案:

答案 0 :(得分:1)

  

因为生成了客户端,实际上并不是我的Service1   实施

这是问题的根源。

您是对的 - 您的代码分析器无法确定您从客户端进行的GetData()调用在语义上与您在接口上定义的GetDate()服务操作相同,因为从在二进制透视图中,它们以两种完全不同的类型定义。

这是你正在使用服务引用的根源。 WCF提供服务引用作为连接到服务的默认方式,但在我看来,服务引用是有问题的,应该避免。

幸运的是,WCF提供了另一种通过ChannelFactory<T>用户使用和调用服务的方式。使用此代替服务引用时将获得的众多好处之一是您的客户端将通过对包含服务定义的程序集的二进制引用来使用服务接口。

这将允许代码镜头等工具将您的接口方法的引用直接解析为您的使用客户端。