2016-04-13 1 views
0

J'utilise le service WCF avec WebHttpBinding. J'ai écrit l'implémentation IDataContractSurrogate personnalisée pour sérialiser enum en tant que chaînes.WCF ne peut pas désérialiser lors de l'utilisation IDataContractSurrogate

Les énumérations sont des WORKS de sérialisation, mais la désérialisation échoue.

lorsque la demande contient ENUM, puis-je obtenir:

Le serveur distant a renvoyé une réponse inattendue: (400) Bad Request.

ou lorsque la réponse contient un ENUM, je reçois:

InvalidCastException: Specified cast is not valid 
Server stack trace: 
    at ReadMyResponseFromJson(XmlReaderDelegator , XmlObjectSerializerReadContextComplexJson , XmlDictionaryString , XmlDictionaryString[]) 
    at System.Runtime.Serialization.Json.JsonClassDataContract.ReadJsonValueCore(XmlReaderDelegator jsonReader, XmlObjectSerializerReadContextComplexJson context) 
    at System.Runtime.Serialization.Json.XmlObjectSerializerReadContextComplexJson.ReadDataContractValue(DataContract dataContract, XmlReaderDelegator reader) 
    at System.Runtime.Serialization.XmlObjectSerializerReadContext.InternalDeserialize(XmlReaderDelegator reader, String name, String ns, Type declaredType, DataContract& dataContract) 
    at System.Runtime.Serialization.XmlObjectSerializerReadContextComplex.InternalDeserializeWithSurrogate(XmlReaderDelegator xmlReader, Type declaredType, DataContract surrogateDataContract, String name, String ns) 
    at System.Runtime.Serialization.XmlObjectSerializerReadContextComplex.InternalDeserialize(XmlReaderDelegator xmlReader, Type declaredType, DataContract dataContract, String name, String ns) 
    at System.Runtime.Serialization.Json.DataContractJsonSerializer.InternalReadObject(XmlReaderDelegator xmlReader, Boolean verifyObjectName) 
    at System.Runtime.Serialization.XmlObjectSerializer.InternalReadObject(XmlReaderDelegator reader, Boolean verifyObjectName, DataContractResolver dataContractResolver) 
    at System.Runtime.Serialization.XmlObjectSerializer.ReadObjectHandleExceptions(XmlReaderDelegator reader, Boolean verifyObjectName, DataContractResolver dataContractResolver) 
    at System.Runtime.Serialization.Json.DataContractJsonSerializer.ReadObject(XmlDictionaryReader reader, Boolean verifyObjectName) 
    at ... 

le code du serveur:

string baseAddress = "http://localhost:8733/Design_Time_Addresses/FingerprintService/"; 
_serviceHost = new WebServiceHost(myServiceInstance, new Uri(baseAddress)); 
_serviceHost.AddServiceEndpoint(typeof (IMyService), new WebHttpBinding(WebHttpSecurityMode.None), baseAddress); 
EndpointExtension.Setup(_serviceHost.Description.Endpoints[0]); 
_serviceHost.Open(); 

code client:

IMyService FingerprintService() 
{ 
    var channelFaftory = new WebChannelFactory<IMyService>(new Uri(TbxUri.Text)); 
    EndpointExtension.Setup(channelFaftory.Endpoint); 
    return channelFaftory.CreateChannel(); 
} 

la configuration du point d'extrémité (commune pour l'hôte et le client):

public static void Setup(ServiceEndpoint endpoint) 
    { 
     var webHttpBehavior = endpoint.Behaviors.Find<WebHttpBehavior>(); 
     if (webHttpBehavior == null) 
     { 
      webHttpBehavior = new WebHttpBehavior(); 
      endpoint.Behaviors.Add(webHttpBehavior); 
     } 


     foreach (OperationDescription opertion in endpoint.Contract.Operations) 
     { 
      var dataContractBehavior = opertion.Behaviors.Find<DataContractSerializerOperationBehavior>(); 
      dataContractBehavior.DataContractSurrogate = new EnumSurrogate(); 
     } 
    } 
} 

et finaly, la mère porteuse:

public class EnumSurrogate : IDataContractSurrogate 
{ 
    public Type GetDataContractType(Type type) 
    { 
     if (type.IsEnum) 
     { 
      return typeof(string); 
     } 
     return type; 
    } 

    public object GetObjectToSerialize(object obj, Type targetType) 
    { 
     if (obj is Enum) 
     { 
      return obj.ToString(); 
     } 
     return obj; 
    } 

    public object GetDeserializedObject(object obj, Type targetType) 
    { 
     if (obj is string && targetType.IsEnum) 
     { 
      return Enum.Parse(targetType, (string)obj); 
     } 
     return obj; 
    } 

    //other methods throws NotImplementedException 
} 

Répondre