WCF和客户端应用程序中的模糊引用

时间:2012-06-18 13:31:49

标签: wcf ambiguous

我设法重现了测试项目中的一个错误,其结构与我的生产代码类似。它由三个简单的项目组成:

Common(类库):

namespace Common
{
    public enum PrimaryColor
    {
        Red,
        Green,
        Blue
    };
}

库(WCF服务库),它引用了Common:

using Common;

namespace Library
{
    [ServiceContract]
    public interface ILibrary
    {
        [OperationContract]
        PrimaryColor GetColor();
    }

    public class Library : ILibrary
    {
        public PrimaryColor GetColor()
        {
            return PrimaryColor.Red;
        }
    }
}

ClientApp(控制台应用程序),其中包含对Common的引用,以及对Library的服务引用,称为“LibraryServiceReference”:

using Common;
using ClientApp.LibraryServiceReference;

namespace ClientApp
{
    class Program
    {
        static void Main(string[] args)
        {
            LibraryClient client = new LibraryClient("WSHttpBinding_ILibrary");
            PrimaryColor color = client.GetColor();
        }
    }
}

ClientApp和Library中的app.config文件是自动生成的,我没有修改它们,我没有更改ClientApp中LibraryServiceReference的默认配置。

编译此解决方案时,我在ClientApp项目中收到以下错误:

错误1

'PrimaryColor' is an ambiguous reference between 'Common.PrimaryColor' and 'ClientApp.LibraryServiceReference.PrimaryColor'

错误2

Cannot implicitly convert type 'ClientApp.LibraryServiceReference.PrimaryColor' to 'Common.PrimaryColor'. An explicit conversion exists (are you missing a cast?)

请帮我解决这个问题。

10 个答案:

答案 0 :(得分:4)

确保在添加服务参考高级选项中选择了'所有参考组件中的重用类型,或配置服务参考

enter image description here

答案 1 :(得分:1)

  1. 像这样装饰你的枚举:

    namespace Common
    {
        [DataContract]
        public enum PrimaryColor
        {
            [EnumMember]
            Red,
            [EnumMember]
            Green,
            [EnumMember]
            Blue
        };
    }
    
  2. 更新您的服务参考(检查重用类型,就像马克所述)。

  3. 重建您的客户代码。

答案 2 :(得分:1)

这是因为你正在构建x64而不是“AnyCpu”。我现在正在讨论这个问题,并试图找出它是否是一个错误,或者它是否是预期的行为。

答案 3 :(得分:0)

听起来你控制了客户端和服务器代码。为什么要创建服务引用,是否有特定原因或仅仅被认为更容易?

在您控制客户端服务器应用程序两端的项目中,您最好创建“合同程序集”(这可能是您的常用程序集)。它包含与合同有关的接口和对象,应由客户端和服务器引用。为了与服务进行通信,客户端使用ChannelFactory创建代理类,因此不需要专用的WCF客户端。

示例:

ChannelFactory<ISampleService> factory = new ChannelFactory<ISampleService>("Binding_from_config");

ISampleService sampleService = factory.CreateChannel();

sampleService.SomeCall();

factory.Close();

工厂模式也使其成为通过IoC注入代理的理想选择。

引用通用程序集而不是创建服务引用的好处是:

  • 没有含糊不清的引用,因为不需要自动生成的类。
  • 每次更改合同时,您都不必更新服务参考。

答案 4 :(得分:0)

我曾多次以无害,不可预知的方式出现这个问题!我以为我会分享我如何修复&#34;这是最后一次。

我正在使用Visual Studio 2013 - 但是已经解决了问题。

模棱两可的参考文献似乎独自出现。我没有做任何引起注意的事情。在最新的例子中,我正在调试一些代码,突然我有7个,然后22个然后49个错误 - 所有相同的性质。

我完全删除了服务引用并重新添加了它。简单地修改重用类型没有任何作用。我的解决方案有一个WCF服务,类库,UI和一个控件库。我还删除了类库后面的一些代码。

这是一个特别棘手的问题,幸好每隔几周就会发生一次。这为何有效?超出我的薪水等级。我感觉到你的痛苦!希望这可以帮助。在这种情况下,当我在xaml页面上打开一些代码时,错误又出现了。

enter image description here

答案 5 :(得分:0)

就其价值而言,将数据协定移动到单独的库后,我遇到了同样的错误。多次更新了服务引用,并尝试了所有设置组合以重新使用程序集,但无济于事。

最终为我解决的问题是:1)重新启动Visual Studio,以及2)更新服务引用。服务定义中Reference.cs中自动生成的代码看起来非常不同,并且没有重复我的数据协定类。它使用了我图书馆的正确参考。因此,必须在IDE中缓存一些内容。

希望其他人对此有用。

答案 6 :(得分:0)

我能够通过右键单击“服务引用”,然后从“所有引用程序集中的重用类型”更改为“指定引用程序集中的重用类型”,然后检查特定的通用程序集来解决此问题。

答案 7 :(得分:0)

只需从ClientApp项目中删除对Common项目的引用,该错误就会消失。为服务创建代理时,必须将服务中的所有相关代码注入代理中。如果您希望您的类型与服务端的类型相同,则只需在生成代理代码时启用“重用类型”选项即可(否则它们将被放置在不同的名称空间下)。

答案 8 :(得分:-1)

这里的问题是,PrimaryColor同时存在于Common和ClientApp.LibraryServiceReference中,并且您正在引用类中的两个名称空间。

要解决此问题,请明确引用您需要的实例,即

Common.PrimaryColor color = ....

或设置别名:

using Service = ClientLibraryServiceReference; ...

Service.PrimaryColor color = ......

答案 9 :(得分:-2)

在提供服务引用时,并没有一些选项可以说:“在生成的服务合同中包含常见类型”?

我认为在您的服务引用中,类被“复制”,这就是您收到此错误的原因。检查生成的服务文件,然后删除,然后使用“添加服务参考”再次添加它们,看看你有哪些选项。

修改

虽然我几乎可以肯定Type PrimaryColor定义了两次。在公共项目中有一次,在服务引用中有一次,您也可以在clientApp中尝试这个(更明确地指定PrimaryColor类型):

Common.PrimaryColor color = client.GetColor();