我正在编写一个 .NET 3.5 应用程序并且可以控制 WCF 服务和客户端。
我正在使用 svcutil 为我的服务生成代理类,将多个服务组合在一起,因为它们共享数据类型。
svcutil /out:ServiceReference.cs /noconfig /namespace:*,Global.ServiceReference
/tcv:Version35 http://localhost:12345/first.svc http://localhost:12345/second.svc
更严重的问题是错误——我有一个类被创建了两次,导致很多“'Global.ServiceReference.MyClass.MyField'和'Global.ServiceReference.MyClass.MyField'之间的歧义”错误。请注意,目前,此类仅在其中一项服务中引用,但将来它将被更多服务引用。
生成的两个类如下所示:
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.Runtime.Serialization", "3.0.0.0")]
[System.Runtime.Serialization.DataContractAttribute(Name="MyClass", Namespace="http://schemas.datacontract.org/2004/07/MyService.Util")]
public partial class MyClass : object, System.Runtime.Serialization.IExtensibleDataObject
{
//fields
}
和
[System.CodeDom.Compiler.GeneratedCodeAttribute("svcutil", "3.0.4506.2152")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(Namespace="http://schemas.datacontract.org/2004/07/MyService.Util")]
public partial class MyClass
{
// same fields
}
根据应用于它们的属性,这与 DataContractSerializer 与 XmlSerializer 有关,但我不太明白这些是什么意思。
第二个问题是 svcutil 给出了一大堆形式的警告:
Error: There was a validation error on a schema generated during export:
Source:
Line: 1 Column: 10415
Validation Error: The simpleType 'http://schemas.microsoft.com/2003/10/Serialization/:guid' has already been declared.
即使使用两个非常简单的服务也会发生这些错误。例如,如果服务 #1 有
[OperationContract]
public string test(int test)
{
return "test";
}
和服务#2有
[OperationContract]
public int Ping(string test)
{
return 23;
}
...我收到警告。大约有 100 个,都在抱怨各种 globalElements、globalAttributes 或 simpleTypes,如 guid、duration、char 等。
如果我将其中一项服务更改为只有 void 参数/返回类型,我不会收到警告。这真的很令人困惑,因为这是最简单的测试。根本不使用任何自定义类型,svcutil 令人讨厌。知道这里发生了什么吗?