未使用WCF Datacontractserializer。Guid是字符串
我的服务配置中有以下basicHttpBinding。当我使用这个服务时,任何guid都被序列化为字符串。仔细检查参考文件后,我发现我的类和对象是用system.xml.serialization而不是datacontractserializer序列化的 我在同一个项目中有另一个服务,它共享端点行为和配置,该服务按预期处理guid 非常感谢任何指点未使用WCF Datacontractserializer。Guid是字符串,wcf,datacontractserializer,Wcf,Datacontractserializer,我的服务配置中有以下basicHttpBinding。当我使用这个服务时,任何guid都被序列化为字符串。仔细检查参考文件后,我发现我的类和对象是用system.xml.serialization而不是datacontractserializer序列化的 我在同一个项目中有另一个服务,它共享端点行为和配置,该服务按预期处理guid 非常感谢任何指点 <service behaviorConfiguration="DefaultServiceBehaviour" name="Extranet
<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。所有代理类都是局部的,因此您可以在不修改生成的文件的情况下添加新属性我已经看过这篇文章的可能副本,但我不必对项目中的其他服务执行此操作。