Тип прокси-сервера POCO не может быть напрямую сериализован или десериализован Windows Communication Foundation (WCF), поскольку механизм сериализации DataContractSerializer может сериализовать и десериализовать только известные типы.Тип прокси не является известным типом.
Если ваши сущности POCO не имеют каких-либо «свойств навигации», вы можете сериализовать объекты ваших сущностей через службы WCF, добавив <DataContract> and <DataMember>
свойства в ваш класс.
Но для сущностей со «свойствами навигации» Помимо добавления <DataContract> and <DataMember>
свойств в ваш класс, вам необходимо внести некоторые изменения в службу WCF следующим образом.Добавьте следующую команду в ваш проект службы WCF.
1.
Imports System.Data.Objects
Imports System.ServiceModel.Description
Imports System.ServiceModel.Channels
Public Class ApplyDataContractResolverAttribute
Inherits Attribute
Implements IOperationBehavior
Public Sub New()
End Sub
Public Sub AddBindingParameters(ByVal operationDescription As OperationDescription, ByVal parameters As BindingParameterCollection) Implements IOperationBehavior.AddBindingParameters
End Sub
Public Sub ApplyClientBehavior(ByVal operationDescription As OperationDescription, ByVal proxy As System.ServiceModel.Dispatcher.ClientOperation) Implements IOperationBehavior.ApplyClientBehavior
Dim dataContractSerializerOperationBehavior As DataContractSerializerOperationBehavior = operationDescription.Behaviors.Find(Of DataContractSerializerOperationBehavior)()
dataContractSerializerOperationBehavior.DataContractResolver = New ProxyDataContractResolver()
End Sub
Public Sub ApplyDispatchBehavior(ByVal operationDescription As OperationDescription, ByVal dispatch As System.ServiceModel.Dispatcher.DispatchOperation) Implements IOperationBehavior.ApplyDispatchBehavior
Dim dataContractSerializerOperationBehavior As DataContractSerializerOperationBehavior = operationDescription.Behaviors.Find(Of DataContractSerializerOperationBehavior)()
dataContractSerializerOperationBehavior.DataContractResolver = New ProxyDataContractResolver()
End Sub
Public Sub Validate(ByVal operationDescription As OperationDescription) Implements IOperationBehavior.Validate
' Do validation.
End Sub
End Class
2. Откройте файл интерфейса службы.По умолчанию он называется IService1.
3. Замените код, определяющий файл интерфейса службы, следующим кодом:
C#
[ServiceContract]
public interface IService1
{
[OperationContract]
[ApplyDataContractResolver]
void UpdateOrder(Order updated);
[OperationContract]
[ApplyDataContractResolver]
Order GetOrder(int OrderID);
}
VB
<ServiceContract> _
Public Interface IService1
<OperationContract> _
<ApplyDataContractResolver> _
Sub UpdateOrder(updated As Order)
<OperationContract> _
<ApplyDataContractResolver> _
Function GetOrder(OrderID As Integer) As Order
End Interface
И вы готовы к работе.