Con risposta Istanziare proxy WCF da codebehind

  • lunedì 20 febbraio 2012 09:01
     
      Contiene codice

    Ciao a tutti,

    stavo refattorizzando un progetto scritto un paio di mesi fa e mi sono accorto di istanziare la chiamata al servizio WCF in un modo non proprio pulito.. avrei bisogno della vostra esperienza... premetto che l'applicazione è un applicazione WPF che recupera i dati da un server web tramite servizi WCF

    La mia classe factory è definita come

         public static T GetChannelFactory(string type)
            {
                CustomBinding myBinding = GetCustomBinding();
    
                string serviceUri =null;
                if(type == "help")
                    serviceUri = ConfigurationManager.AppSettings["helpService"];
                else if(type == "export")
                    serviceUri = ConfigurationManager.AppSettings["exportService"];
    
                if (string.IsNullOrEmpty(serviceUri))
                    throw new Exception(string.Format("No active endpoint listening for type  {0}", type));
                else
                {
                    EndpointAddress myEndpoint = new EndpointAddress(serviceUri);
    
                    ChannelFactory<T> myChannelFactory = new ChannelFactory<T>(myBinding, myEndpoint);
    
                    foreach (OperationDescription op in myChannelFactory.Endpoint.Contract.Operations)
                    {
                        DataContractSerializerOperationBehavior dataContractBehavior = op.Behaviors.Find<DataContractSerializerOperationBehavior>();
    
                        if (dataContractBehavior != null)
                        {
                            dataContractBehavior.MaxItemsInObjectGraph = Int32.MaxValue;
                        }
                       
                    }
    
                    return myChannelFactory.CreateChannel();
                }
            }
    
    
            private static CustomBinding GetCustomBinding()
            {
                CustomBinding customBinding = new CustomBinding();
    
                customBinding.ReceiveTimeout = new TimeSpan(0, 30, 0);
                customBinding.OpenTimeout = new TimeSpan(0, 30, 0);
                customBinding.SendTimeout = new TimeSpan(0, 30, 0);
                customBinding.CloseTimeout = new TimeSpan(0, 30, 0);
    
                AddHttpElements(customBinding);
    
                return customBinding;
            }
    
            private static void AddHttpElements(CustomBinding customBinding)
            {
                BinaryMessageEncodingBindingElement binaryElement = new BinaryMessageEncodingBindingElement();
                HttpTransportBindingElement transport = new HttpTransportBindingElement();
    
                transport.MaxBufferSize = 2147483647;
                transport.MaxReceivedMessageSize = 2147483647;
    
                customBinding.Elements.Add(binaryElement);
                customBinding.Elements.Add(transport);
            }
    

    Il mio problema è che ho aggiunto nel servizio web un extension per la compressione zip dello stream di dati ma ora dovrei modificare anche questo codice... con un servizio definito nel modo classico del tipo

    MyService service = new Serivice();

    prenderebbe i vari settings direttamente dall'app.config.. qual'è il miglio modo di istanziare un servizio WCF da codebehind?

    Grazie ciao

Tutte le risposte

  • lunedì 20 febbraio 2012 10:31
     
     Con risposta Contiene codice

    elementare Watson! :)

    2 alternative

    1) se fai AddServiceReference, allora dovrai fare semplicemente

    var client = new ServiceReference1.MyServiceClient();
    
    client.MyOperation();

    2) se invece vuoi andare in autonomia avendo però tutti i contratti di servizio (il servicecontract e i vari datacontract come interfacce in una dll condivisa col servizio)

    var factory = new ChannelFactory<MyLib.IMyService>("myclientconfigname");
    
    var client = f.CreateChannel();

    ovviamente poi nel config dovrai avere nella sezione system.servicemodel sotto Clientes un Client con il nome uguale a quello che passi nel channelfactory

    questo si leggerà da solo tutta la configurazione nel modo corretto di WCF

    a presto


    Antonio Esposito [MCT, MCPD, MCTS, MCP]
    dotnetlombardia.org | blog | web | @tonyexpo
    Italy
     

    • Contrassegnato come risposta Ponzano Paolo lunedì 20 febbraio 2012 13:46
    •