将标志添加到枚举后: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”生成代码的主要内容,如果未能解决你的问题,请参考以下文章

如何将自定义 WCF 协议通道添加到现有绑定

C# WCF -- 通过自定义 AuthorizationManager 自定义错误授权失败

客户端的 WCF Web 服务自定义异常错误

此 WCF 错误是啥意思:“自定义工具警告:无法导入 wsdl:portType”

自定义 wcf 数据提供者和调试关系错误

将视频添加到自定义照片集合返回错误