未使用WCF Datacontractserializer。Guid是字符串

未使用WCF Datacontractserializer。Guid是字符串,wcf,datacontractserializer,Wcf,Datacontractserializer,我的服务配置中有以下basicHttpBinding。当我使用这个服务时,任何guid都被序列化为字符串。仔细检查参考文件后,我发现我的类和对象是用system.xml.serialization而不是datacontractserializer序列化的 我在同一个项目中有另一个服务,它共享端点行为和配置,该服务按预期处理guid 非常感谢任何指点 <service behaviorConfiguration="DefaultServiceBehaviour" name="Extranet

我的服务配置中有以下basicHttpBinding。当我使用这个服务时,任何guid都被序列化为字符串。仔细检查参考文件后,我发现我的类和对象是用system.xml.serialization而不是datacontractserializer序列化的

我在同一个项目中有另一个服务,它共享端点行为和配置,该服务按预期处理guid

非常感谢任何指点

<service behaviorConfiguration="DefaultServiceBehaviour" name="ExtranetService.Repositories.Client.Submission.PSPSubmission.GoalRepository.GoalRepositoryService">
    <endpoint address="basic" 
              behaviorConfiguration="basicBehaviorConfig"
              binding="basicHttpBinding"
              bindingConfiguration="basicBindingConfig"
              name="basicEndpoint" 
              bindingName="basicBinding"
              contract="ExtranetService.Repositories.Client.Submission.PSPSubmission.GoalRepository.GoalRepositoryService"
              listenUriMode="Explicit" />
    <host>
        <baseAddresses>
            <add baseAddress="https://blah.com/Repositories/client/submission/pspsubmission/GoalRepositoryService.svc"/>
        </baseAddresses>
    </host>
</service>

<basicHttpBinding>
    <binding name="basicBindingConfig" 
             closeTimeout="00:05:00" 
             maxBufferPoolSize="2147483646" maxBufferSize="2147483646"
             maxReceivedMessageSize="2147483646">
       <readerQuotas maxDepth="32" 
                     maxStringContentLength="2147483646"
                     maxArrayLength="2147483646" />
       <security mode="Transport">
           <message clientCredentialType="Certificate" />
        </security>
    </binding>
</basicHttpBinding>

<serviceBehaviors>
    <behavior name="DefaultServiceBehaviour">
    <serviceMetadata />
    <serviceDebug />
        <dataContractSerializer />
    </behavior>
</serviceBehaviors>

<endpointBehaviors>
    <behavior name="basicBehaviorConfig">
        <dataContractSerializer />
    </behavior>
</endpointBehaviors>


<System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.0.30319.34234"),  _
System.SerializableAttribute(),  _
System.Diagnostics.DebuggerStepThroughAttribute(),  _
System.ComponentModel.DesignerCategoryAttribute("code"),  _
System.Xml.Serialization.XmlTypeAttribute([Namespace]:="http://schemas.datacontract.org/2004/07/ExtranetService.Repositories.Client.Submission.PSPSubmission.GoalRepository")>  _
Partial Public Class GetGoalByIdRequestObject
    Inherits Object
    Implements System.ComponentModel.INotifyPropertyChanged

    Private idField As String

    <System.Xml.Serialization.XmlElementAttribute(Order:=0)>  _
    Public Property Id() As String
        Get
            Return Me.idField
        End Get
        Set
            Me.idField = value
            Me.RaisePropertyChanged("Id")
        End Set
    End Property

    Public Event PropertyChanged As System.ComponentModel.PropertyChangedEventHandler Implements System.ComponentModel.INotifyPropertyChanged.PropertyChanged

    Protected Sub RaisePropertyChanged(ByVal propertyName As String)
        Dim propertyChanged As System.ComponentModel.PropertyChangedEventHandler = Me.PropertyChangedEvent
        If (Not (propertyChanged) Is Nothing) Then
            propertyChanged(Me, New System.ComponentModel.PropertyChangedEventArgs(propertyName))
        End If
    End Sub
End Class

_
部分公共类GetGoalBydRequestObject
继承对象
实现System.ComponentModel.INotifyPropertyChanged
私有idField作为字符串
_
作为字符串的公共属性Id()
得到
还我,艾德菲尔德
结束
设置
Me.idField=值
Me.RaisePropertyChanged(“Id”)
端集
端属性
公共事件属性更改为System.ComponentModel.PropertyChangedEventHandler实现System.ComponentModel.INotifyPropertyChanged.PropertyChanged
受保护的子RaisePropertyChanged(ByVal propertyName作为字符串)
Dim Property更改为System.ComponentModel.PropertyChangedEventHandler=Me.PropertyChangedEvent
如果(Not(propertyChanged)什么都不是),那么
propertyChanged(Me,新系统.ComponentModel.PropertyChangedEventArgs(propertyName))
如果结束
端接头
末级
编辑 这是来自同一项目中另一个服务的代码,显示了预期的guid

<System.Diagnostics.DebuggerStepThroughAttribute(),  _
 System.CodeDom.Compiler.GeneratedCodeAttribute("System.Runtime.Serialization", "4.0.0.0"),  _
 System.Runtime.Serialization.DataContractAttribute(Name:="GetClientRecommendationListRequestObject", [Namespace]:="http://schemas.datacontract.org/2004/07/ExtranetService.Repositories.Client.Submi"& _ 
    "ssion.PSPSubmission"),  _
 System.SerializableAttribute()>  _
Partial Public Class GetClientRecommendationListRequestObject
    Inherits Object
    Implements System.Runtime.Serialization.IExtensibleDataObject, System.ComponentModel.INotifyPropertyChanged

    <System.NonSerializedAttribute()>  _
    Private extensionDataField As System.Runtime.Serialization.ExtensionDataObject

    <System.Runtime.Serialization.OptionalFieldAttribute()>  _
    Private CLNT_CLIENT_IDField As System.Guid

    <Global.System.ComponentModel.BrowsableAttribute(false)>  _
    Public Property ExtensionData() As System.Runtime.Serialization.ExtensionDataObject Implements System.Runtime.Serialization.IExtensibleDataObject.ExtensionData
        Get
            Return Me.extensionDataField
        End Get
        Set
            Me.extensionDataField = value
        End Set
    End Property

    <System.Runtime.Serialization.DataMemberAttribute()>  _
    Public Property CLNT_CLIENT_ID() As System.Guid
        Get
            Return Me.CLNT_CLIENT_IDField
        End Get
        Set
            If (Me.CLNT_CLIENT_IDField.Equals(value) <> true) Then
                Me.CLNT_CLIENT_IDField = value
                Me.RaisePropertyChanged("CLNT_CLIENT_ID")
            End If
        End Set
    End Property

    Public Event PropertyChanged As System.ComponentModel.PropertyChangedEventHandler Implements System.ComponentModel.INotifyPropertyChanged.PropertyChanged

    Protected Sub RaisePropertyChanged(ByVal propertyName As String)
        Dim propertyChanged As System.ComponentModel.PropertyChangedEventHandler = Me.PropertyChangedEvent
        If (Not (propertyChanged) Is Nothing) Then
            propertyChanged(Me, New System.ComponentModel.PropertyChangedEventArgs(propertyName))
        End If
    End Sub
End Class
_
部分公共类GetClientRecommensionListRequestObject
继承对象
实现System.Runtime.Serialization.IExtensibleDataObject、System.ComponentModel.INotifyPropertyChanged
_
私有extensionDataField作为System.Runtime.Serialization.ExtensionDataObject
_
专用CLNT\u客户端\u IDField作为System.Guid
_
公共属性ExtensionData()作为System.Runtime.Serialization.ExtensionDataObject实现System.Runtime.Serialization.IExtensibleDataObject.ExtensionData
得到
Return Me.extensionDataField
结束
设置
Me.extensionDataField=值
端集
端属性
_
公共属性CLNT\u CLIENT\u ID()作为System.Guid
得到
Return Me.CLNT\u CLIENT\u IDField
结束
设置
如果(Me.CLNT\u CLIENT\u IDField.Equals(value)true),则
Me.CLNT\u CLIENT\u IDField=值
Me.RaisePropertyChanged(“CLNT\U客户ID”)
如果结束
端集
端属性
公共事件属性更改为System.ComponentModel.PropertyChangedEventHandler实现System.ComponentModel.INotifyPropertyChanged.PropertyChanged
受保护的子RaisePropertyChanged(ByVal propertyName作为字符串)
Dim Property更改为System.ComponentModel.PropertyChangedEventHandler=Me.PropertyChangedEvent
如果(Not(propertyChanged)什么都不是),那么
propertyChanged(Me,新系统.ComponentModel.PropertyChangedEventArgs(propertyName))
如果结束
端接头
末级

GUID不是有效的XML数据类型,因此不能在XSD架构中用作成员类型。无论使用哪种序列化程序,如果希望使用其中一个Http绑定,GUI都将序列化为字符串,并在模式中定义为字符串

从这个模式生成的任何代理都将创建一个字符串类型的属性,因为XSD就是这样定义的

重复问题显示了如何将GUID作为字节数组传递,尽管这会影响互操作性

另一种选择是将所有数据契约类放在一个单独的库中,该库由客户机和服务器代码共享。生成代理时将使用DTO程序集中的类,而不是创建新的类


另一种方法是向代理DTO类添加另一个属性,例如IdAsGuid(),该类解析字符串值并返回GUID。所有代理类都是局部的,因此您可以在不修改生成的文件的情况下添加新属性

我已经看过这篇文章的可能副本,但我不必对项目中的其他服务执行此操作。