我设法重现了测试项目中的一个错误,其结构与我的生产代码类似。它由三个简单的项目组成:
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?)
请帮我解决这个问题。
答案 0 :(得分:4)
确保在添加服务参考的高级选项中选择了'所有参考组件中的重用类型,或配置服务参考。
答案 1 :(得分:1)
像这样装饰你的枚举:
namespace Common
{
[DataContract]
public enum PrimaryColor
{
[EnumMember]
Red,
[EnumMember]
Green,
[EnumMember]
Blue
};
}
更新您的服务参考(检查重用类型,就像马克所述)。
重建您的客户代码。
答案 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页面上打开一些代码时,错误又出现了。
答案 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();