none
没人解答的问题,见正文 RRS feed

  • 问题

  • WCF服务可以由客户端添加服务引用生成代理类,并且会自己生成WCF服务所用到的类的客户端实体。
    但每个WCF服务就要添加一个WCF引用,在不同的WCF服务中所用到的类可能是相同,而客户端却会生成多个相同类。
    此问题有何解决办法?

    WebService下,客户端生的代理类本都在同一名称空间,
    但是WCF,客户端通过添加服务引用,每一个服务就得有一个命名空间,客户端生的代理类就分属于不同名称空间

    这样的问题应该调整Wcf的写法还是客户端添加Wcf服务引用时需有改动呢?

    谢谢

    2009年9月10日 7:10

答案

  • Hi,
       你说的情况确实存在。
       对于WCF的客户端来说,客户端添加服务引用生成的本地契约有可能相同,如果出现重复。也只是表面的重复。
    实际服务端契约的定义可能差别很大,比如服务契约隐藏了很多成员。
       
       对于这个问题你可以手动调整,使客户端的代理公用一个契约定义。
       但是这个也会带来的问题就是,一旦你服务端其中一个契约调整。客户端更新就会导致错乱。可能带来的麻烦更多。其它服务无法使用。
       每个契约分布在不同的命名空间下还是有一定好处的。
       你可以根据实际情况取舍。
    Frank Xu Lei--谦卑若愚,好学若饥
    专注于.NET平台下分布式应用系统开发和企业应用系统集成
    Focus on Distributed Applications Development and EAI based on .NET
    欢迎访问老徐的中文技术博客:Welcome to My Chinese Technical Blog
    欢迎访问微软WCF中文技术论坛:Welcome to Microsoft Chinese WCF Forum
    欢迎访问微软WCF英文技术论坛:Welcome to Microsoft English WCF Forum
    2009年9月10日 16:14
    版主
  • 对于一个相同的contract 不建议在每一个wcf工程内部声明阿 :o

    您能不能建立一个 wcf class lib   在里面声明

        [ServiceContract]
        public interface IService1
    {}
        [DataContract]
        public class CompositeType1
        {
            ...
        }



    然后在两个服务工程内  分别用两个service实现这个接口呢
    这样他们就可以在客户端用同一个服务器引用  +不同的url调用了

    这也是将服务抽象为合同的本意阿


    恭喜自己5星用户达成
    2009年9月11日 4:57

全部回复

  • 实现相同的服务contract 的服务群  是不需要多次引用的  之需要访问前指定访问的url就可以了

    多个服务之间  可以通过对WCF Lib工程 的引用 保证他们的 contract 相同


    恭喜自己5星用户达成
    2009年9月10日 8:32
  • Hi,
       你说的情况确实存在。
       对于WCF的客户端来说,客户端添加服务引用生成的本地契约有可能相同,如果出现重复。也只是表面的重复。
    实际服务端契约的定义可能差别很大,比如服务契约隐藏了很多成员。
       
       对于这个问题你可以手动调整,使客户端的代理公用一个契约定义。
       但是这个也会带来的问题就是,一旦你服务端其中一个契约调整。客户端更新就会导致错乱。可能带来的麻烦更多。其它服务无法使用。
       每个契约分布在不同的命名空间下还是有一定好处的。
       你可以根据实际情况取舍。
    Frank Xu Lei--谦卑若愚,好学若饥
    专注于.NET平台下分布式应用系统开发和企业应用系统集成
    Focus on Distributed Applications Development and EAI based on .NET
    欢迎访问老徐的中文技术博客:Welcome to My Chinese Technical Blog
    欢迎访问微软WCF中文技术论坛:Welcome to Microsoft Chinese WCF Forum
    欢迎访问微软WCF英文技术论坛:Welcome to Microsoft English WCF Forum
    2009年9月10日 16:14
    版主
  • 看到了回复,似乎还是有办法解决的,我也把我遇到的问题通过项目代码进一步阐述应用场景,希望能够得知详细解决办法,谢谢两位专家
    联系方法:gefa_cn@hotmial.com,盼回复!

    IService1.cs:

    namespace WcfService
    {
        [ServiceContract]
        public interface IService1
        {
            [OperationContract]
            string GetData(int value);

            [OperationContract]
            CompositeType1 GetDataUsingDataContract(WcfService2.CompositeType1 composite1, WcfService2.CompositeType2 composite2);

            // 任务: 在此处添加服务操作
        }

        // 使用下面示例中说明的数据约定将复合类型添加到服务操作。
        [DataContract]
        public class CompositeType1
        {
            ...
        }
    }

    IService2:

    namespace WcfService
    {
        [ServiceContract]
        public interface IService2
        {
            [OperationContract]
            string GetData(int value);

            [OperationContract]
            CompositeType2 GetDataUsingDataContract(WcfService2.CompositeType1 composite1, WcfService2.CompositeType2 composite2);

            // 任务: 在此处添加服务操作
        }

        // 使用下面示例中说明的数据约定将复合类型添加到服务操作。
        [DataContract]
        public class CompositeType2
        {
            ...
        }
    }

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

            public CompositeType1 GetDataUsingDataContract(CompositeType1 composite1, CompositeType2 composite2)
            {
                if (composite1.BoolValue)
                {
                    composite1.StringValue += composite2.StringValue;
                }

                return composite1;
            }
        }

    Service2.svc:
    ...

    Service2.svc.cs:
        ...
        public class Service2 : IService2
        {
            public string GetData(int value)
            {
                return string.Format("You entered: {0}", value);
            }

            public CompositeType2 GetDataUsingDataContract(CompositeType1 composite1, CompositeType2 composite2)
            {
                if (composite1.BoolValue)
                {
                    composite1.StringValue += composite2.StringValue;
                }

                return composite2;
            }
        }


    如果客户端通过“添加服务引用”添加两个Wcf服务,同一命名空间中定义分别有2个自定义类CompositeType1CompositeType2,客户端添加了服务引用WcfService1WcfService2后,客户端生成了WcfService1.CompositeType1WcfService1.CompositeType2WcfService2.CompositeType1WcfService2.CompositeType2四个代理类,且彼此不能强制转换。


    如果客户端通过“添加Web引用”来添加,并不会出现名称空间的问题,自然也就不存在类重复的问题,但会出现Guid类型自动转换为string类型的现象。同样都是通过SvcUtil.exe工具来生成的,命名空间处理上怎么会有如此大的差异呢?

    2009年9月11日 1:27
  • 对于一个相同的contract 不建议在每一个wcf工程内部声明阿 :o

    您能不能建立一个 wcf class lib   在里面声明

        [ServiceContract]
        public interface IService1
    {}
        [DataContract]
        public class CompositeType1
        {
            ...
        }



    然后在两个服务工程内  分别用两个service实现这个接口呢
    这样他们就可以在客户端用同一个服务器引用  +不同的url调用了

    这也是将服务抽象为合同的本意阿


    恭喜自己5星用户达成
    2009年9月11日 4:57
  • 不用客气,大家都是技术爱好者,不是什么砖家。~
    你这里的4个代理类和数据契约,
    我猜测是你添加了两次服务引用,实际也就2个足以。重复添加,而且你输入了两次namespace。
    第二次实际是多余的。这里是不需要添加两次的。

    Frank Xu Lei--谦卑若愚,好学若饥
    专注于.NET平台下分布式应用系统开发和企业应用系统集成
    Focus on Distributed Applications Development and EAI based on .NET
    欢迎访问老徐的中文技术博客:Welcome to My Chinese Technical Blog
    欢迎访问微软WCF中文技术论坛:Welcome to Microsoft Chinese WCF Forum
    欢迎访问微软WCF英文技术论坛:Welcome to Microsoft English WCF Forum
    2009年9月11日 10:20
    版主