将标志添加到枚举后:Wcf 错误:错误 5 自定义工具错误:无法为服务引用“MyService”生成代码
Posted
技术标签:
【中文标题】将标志添加到枚举后:Wcf 错误:错误 5 自定义工具错误:无法为服务引用“MyService”生成代码【英文标题】:After adding flags to enum: Wcf error: Error 5 Custom tool error: Failed to generate code for the service reference 'MyService' 【发布时间】:2012-08-23 09:44:17 【问题描述】:在我的 WCF 服务上,我只是将枚举更改为:
/// <summary>
/// The DocumentState enum.
/// </summary>
[DataContract]
public enum DocumentState
/// <summary>
/// Undefined.
/// </summary>
[EnumMember]
Undefined,
/// <summary>
/// OK.
/// </summary>
[EnumMember]
Ok
到:
/// <summary>
/// The DocumentState enum.
/// </summary>
[DataContract]
[Flags]
public enum DocumentState
/// <summary>
/// Undefined.
/// </summary>
[EnumMember]
Undefined = 0,
/// <summary>
/// OK.
/// </summary>
[EnumMember]
Ok = 1
在客户端我更新 WCF 引用没有任何问题,但重建后我得到:
错误 5 自定义工具错误:无法为服务引用“MyService”生成代码。有关详细信息,请查看其他错误和警告消息
这个标志枚举有什么问题?
更新:
好的..在警告中我发现了这个,但这并没有真正帮助我:
警告 1 自定义工具警告:无法导入 wsdl:portType 详细信息:运行 WSDL 导入扩展时引发异常:System.ServiceModel.Description.DataContractSerializerMessageContractImporter 错误:引用类型 'TestSolution.Test.Entities.Documents.Document、TestSolution.Test.Entities、Version=1.1.78.7965、Culture=neutral、PublicKeyToken=7ad0fddf5c57b9b3' 与命名空间 'http://schemas 中的数据合同名称 'Document' .datacontract.org/2004/07/TestSolution.Test.Entities.Documents' 无法使用,因为它与导入的 DataContract 不匹配。需要从引用类型中排除此类型。
错误源的 XPath://wsdl:definitions[@targetNamespace='http://tempuri.org/']/wsdl:portType[@name='IDocumentService'] c:\TFS1\TestSolution - Test\Test \Test.Core\Service References\DocumentService\Reference.svcmap 1 1 Test.Core 警告 2 自定义工具警告:无法导入 wsdl:binding 详细信息:导入 wsdl:binding 所依赖的 wsdl:portType 时出错。
到 wsdl:portType 的 XPath://wsdl:definitions[@targetNamespace='http://tempuri.org/']/wsdl:portType[@name='IDocumentService'] 错误源的 XPath://wsdl:definitions[@targetNamespace='http://tempuri.org/']/wsdl:binding[@name='NetTcpEndpoint'] c:\TFS1\TestSolution - Test\Test\Test。 Core\Service References\DocumentService\Reference.svcmap 1 1 Test.Core 警告 3 自定义工具警告:无法导入 wsdl:port
详细信息:导入 wsdl:port 所依赖的 wsdl:binding 时出错。 wsdl:binding 的 XPath: //wsdl:definitions[@targetNamespace='http://tempuri.org/']/wsdl:binding[@name='NetTcpEndpoint'] 错误源的 XPath://wsdl:definitions[@targetNamespace='http://tempuri.org/']/wsdl:service[@name='DocumentService']/wsdl:port[@name='NetTcpEndpoint'] c :\TFS1\TestSolution - Test\Test\Test.Core\Service References\DocumentService\Reference.svcmap 1 1 Test.Core 错误 4 自定义工具错误:无法为服务引用“DocumentService”生成代码。有关详细信息,请查看其他错误和警告消息。 c:\TFS1\TestSolution - Test\Test\Test.Core\Service References\DocumentService\Reference.svcmap 1 1 Test.Core
【问题讨论】:
更新:一些额外的信息给你: - 我正在使用 net.tcp 绑定 - 枚举在分钟内使用。 wcf 服务和客户端上已经有 50 个位置(没有 flags 属性) - 当我创建一个具有相同名称但名称末尾有 2 的新枚举时,一切都很好!关于“wsdl:portType”/“wsdl:binding”/“wsdl:port”的警告究竟意味着什么?? 【参考方案1】:当您添加 Flag
属性时,您更改了 Enum 的存储方式并使该类型的变量能够保存多个值。这个MSDN post 解释了 WCF 如何处理这个问题的细节。除非您真的打算将该 Enum 用作标志字段,否则我会摆脱它,因为它不必要地使 Enum 含义复杂化。
【讨论】:
仍然没有看到问题:( 好的..在警告中我发现了这个,但这并没有真正帮助我: 我认为简单的解决方案是像以前一样删除Flag
属性和枚举。通过添加它,您更改了 Enum 的数据类型,这对您的客户端造成了破坏性更改。
在这种情况下,引入一个新的Enum DocStateFlags
并更改您的服务器和客户端代码以使用新的枚举。没有简单的方法可以在不重写代码的情况下将当前的 Enum 转换为 Flag
类型。
刚刚在项目中发现了一个新的警告:Warning 1 Custom tool warning: An item with the same key has been added。 C:\Test\Service References\DocumentService\Reference.svcmap 1 1 Test.Core以上是关于将标志添加到枚举后:Wcf 错误:错误 5 自定义工具错误:无法为服务引用“MyService”生成代码的主要内容,如果未能解决你的问题,请参考以下文章
C# WCF -- 通过自定义 AuthorizationManager 自定义错误授权失败