2016-04-13 37 views
0

kullanırken serileştirilemiyor, WebHttpBinding ile WCF hizmetini kullanıyorum. Enum dizileri olarak serileştirmek için özel IDataContractSurrogate uygulamasını yazdım.WCF IDataContractSurrogate

Enumlar seri hale getirme İŞLER, ancak seri hale getirme başarısız oluyor. istek enum içerdiğinde

, o zaman ben alıyorum: (400) Geçersiz İstek:

Uzak sunucu beklenmeyen bir yanıt döndürdü. yanıtı Bir enum içerdiğinde

ya, o zaman ben alıyorum:

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 ... 

sunucu kodu:

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(); 

istemci kodu:

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

uç nokta kurulumu (ortak hem ana bilgisayar hem de istemci için):

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(); 
     } 
    } 
} 

ve sonda gelen, vekil:

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 
} 

cevap