The service has an interface that allows
inherited types to be passed over it.
[ServiceKnownType("GetKnownProductTypes", typeof(KnownTypeHelper))]
public interface IDealBookingService{
[OperationContract]
int SaveProduct(ProductBase product);
}
[DataMember]
public DateTime StartDate3
{
get { return StartDate; }
}
Running this on a developer’s machine, no problems were
encountered.
However, deploying this to a downstream environment, the following error was thrown when the service started:
However, deploying this to a downstream environment, the following error was thrown when the service started:
Unhandled Exception:
System.Runtime.Serialization.InvalidDataContractException:
No set method for property 'StartDate3' in type
'ServiceContract.MyDerivedType'.
at
System.Runtime.Serialization.DataContract.DataContractCriticalHelper.Throw
InvalidDataContractException(String
message, Type type)
at
System.Runtime.Serialization.ClassDataContract.ClassDataContractCriticalHe
lper.ImportDataMembers()
at
System.Runtime.Serialization.ClassDataContract.ClassDataContractCriticalHe
lper..ctor(Type type)
at
System.Runtime.Serialization.DataContract.DataContractCriticalHelper.Creat
eDataContract(Int32 id,
RuntimeTypeHandle typeHandle, Type type)
at
System.Runtime.Serialization.DataContract.DataContractCriticalHelper.GetDa
taContractSkipValidation(Int32
id, RuntimeTypeHandle typeHandle, Type type)
at
System.Runtime.Serialization.XsdDataContractExporter.GetSchemaTypeName(Typ
e type)
at
System.ServiceModel.Dispatcher.DataContractSerializerOperationFormatter.Va
lidateDataContractType(Type
type)
at System.ServiceModel.Dispatcher.DataContractSerializerOperationFormatter..c
tor(OperationDescription
description, DataContractFormatAttribute dataContractFo
rmatAttribute,
DataContractSerializerOperationBehavior serializerFactory)
at
System.ServiceModel.Description.DataContractSerializerOperationBehavior.Ge
tFormatter(OperationDescription
operation, Boolean& formatRequest, Boolean& form
atReply, Boolean isProxy)
at
System.ServiceModel.Description.DataContractSerializerOperationBehavior.Sy
stem.ServiceModel.Description.IOperationBehavior.ApplyDispatchBehavior(Operation
Description description,
DispatchOperation dispatch)
at
System.ServiceModel.Description.DispatcherBuilder.BindOperations(ContractD
escription contract,
ClientRuntime proxy, DispatchRuntime dispatch)
at
System.ServiceModel.Description.DispatcherBuilder.InitializeServiceHost(Se
rviceDescription description,
ServiceHostBase serviceHost)
at
System.ServiceModel.ServiceHostBase.InitializeRuntime()
at
System.ServiceModel.ServiceHostBase.OnBeginOpen()
at
System.ServiceModel.ServiceHostBase.OnOpen(TimeSpan timeout)
at
System.ServiceModel.Channels.CommunicationObject.Open(TimeSpan timeout)
at
Service.Host.ServiceController.Start() in C:\Source Code\Test\TestWCF\Serv
ice.Host\ServiceController.cs:line
14
at
Service.Host.Program.Main(String[] args) in C:\Source Code\Test\TestWCF\Se
rvice.Host\Program.cs:line 13
The developer’s machine had .NET 4.5 installed. After
installing .NET 4.5 to the target machine the problem was resolved. (The other
code-based solution was to add an internal set property to the data class as
the exception hinted).
Inspecting the .NET code, it can be seen there is a runtime
serialization difference between the two versions - .NET 4.5 is more forgiving
than the earlier version for this scenario.
I haven’t found any documentation about serialization
changes between the versions.
No comments:
Post a Comment