c# - 使用 svcutil.exe 为多个 WCF 服务创建代理类的错误/警告

标签 c# .net wcf svcutil.exe

我正在编写一个 .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 或 guid、duration、char 等简单类型。

如果我将其中一项服务更改为只有无效参数/返回类型,我不会收到警告。这真的很令人困惑,因为这是最简单的测试。根本不使用任何自定义类型,svcutil 就会吐出​​来。知道这里发生了什么吗?

最佳答案

XSD 文件中的某些内容导致 svcutil 调用 XmlSerializer 来生成您的某些类型。不幸的是,DataContract 和 XmlSerializer 之间的类型共享不可用,因此您最终会得到重复的类型。由于看起来您可能在服务器上专门使用 DC,因此仅强制 svcutil 保持 DC 模式并且不切换到 XmlSerializer 就足够了,如下所示:

svcutil /serializer:DataContractSerializer ...

关于c# - 使用 svcutil.exe 为多个 WCF 服务创建代理类的错误/警告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1751310/

相关文章:

c# - EF6 中的急切、延迟和显式加载

javascript - 防止在 js 中为 Web 表单下拉列表回发

c# - 在构建 dll 后更新 DLL 元数据

c# - DhtmlX 甘特图未获得正确的链接目标 ID

c# - "<"运算符(operator)错误

.net - 将解决方案更新到.net Framework 4.7 : issue with Roslyn

.net - 命名空间名称中术语的首选顺序

c# - MSMQ 绑定(bind)不匹配

c# - IP 端点 0.0.0.0 :13000. 上已经有一个监听器 ?? (使用 WCF 的 TCP)

wcf - 无法使用 Fiddler 将 JSON 发布数据传递到 WCF REST 服务