Quando si utilizza WCF insieme ad EF 4.0 e le classi POCO, può accadere che durante il “trasferimento” (serializzazione) degli oggetti venga visualizzata la seguente eccezione:
in forma descrittiva:
Failed to invoke the service. Possible causes: The service is offline or inaccessible; the client-side configuration does not match the proxy; the existing proxy is invalid. Refer to the stack trace for more detail. You can try to recover by starting a new proxy, restoring to default configuration, or refreshing the service.
Per risolvere il problema è sufficiente aggiungere la classe seguente, recuperata da msdn, che costituisce un attributo personalizzato da aggiungere ai vari attributi [OperationContract] :
1: public class ApplyDataContractResolverAttribute : Attribute, IOperationBehavior
2: {
3: public ApplyDataContractResolverAttribute() { }
4:
5: public void AddBindingParameters(OperationDescription description, BindingParameterCollection parameters) {}
6:
7: public void ApplyClientBehavior(OperationDescription description, System.ServiceModel.Dispatcher.ClientOperation proxy)
8: {
9: DataContractSerializerOperationBehavior dataContractSerializerOperationBehavior =
10: description.Behaviors.Find<DataContractSerializerOperationBehavior>();
11: dataContractSerializerOperationBehavior.DataContractResolver =
12: new ProxyDataContractResolver();
13: }
14:
15: public void ApplyDispatchBehavior(OperationDescription description, System.ServiceModel.Dispatcher.DispatchOperation dispatch)
16: {
17: DataContractSerializerOperationBehavior dataContractSerializerOperationBehavior =
18: description.Behaviors.Find<DataContractSerializerOperationBehavior>();
19: dataContractSerializerOperationBehavior.DataContractResolver =
20: new ProxyDataContractResolver();
21: }
22:
23: public void Validate(OperationDescription description)
24: {
25: // Do validation.
26: }
27: }
Quindi, nell’interfaccia che descrive il nostro servizio, avremo qualcosa di questo tipo:
1: [OperationContract]
2: [ApplyDataContractResolver]
3: bool Fuction1(POCOObject o);
Risolvendo il problema dell’eccezione. Lo stesso risultato può essere ottenuto disabilitando la creazione delle classi Proxy nella classe derivata da ObjectContext, impostando la proprietà ContextOptions.ProxyCreationEnabled a False.
Purtroppo non ho il tempo di approfondire l’argomento in questo post, ma è possibile trovare maggiori informazioni sull’argomento qui