Domanda

Qualcuno conosce un buon esempio di come esporre un servizio WCF a livello di programmazione, senza l'uso di un file di configurazione?So che il modello a oggetti di servizio, è molto più ricca ora con WCF, quindi so che è possibile.Io non ho visto un esempio di come farlo.Al contrario, mi piacerebbe vedere come consumo senza un file di configurazione è fatto così.

Prima che qualcuno te lo chiede, ho un bisogno specifico, senza il file di configurazione.Io normalmente non consiglia di tale pratica, ma come ho detto, c'è un bisogno specifico, in questo caso.

È stato utile?

Soluzione

Consumare un web service senza un file di configurazione è molto semplice, come ho scoperto.Hai semplicemente bisogno di creare un oggetto associazione e oggetto di indirizzo e di passare al costruttore del client proxy o di un generico ChannelFactory istanza.È possibile guardare l'app predefinita.config per vedere quali impostazioni utilizzare, quindi creare un supporto statico metodo da qualche parte che crea il tuo proxy:

internal static MyServiceSoapClient CreateWebServiceInstance() {
    BasicHttpBinding binding = new BasicHttpBinding();
    // I think most (or all) of these are defaults--I just copied them from app.config:
    binding.SendTimeout = TimeSpan.FromMinutes( 1 );
    binding.OpenTimeout = TimeSpan.FromMinutes( 1 );
    binding.CloseTimeout = TimeSpan.FromMinutes( 1 );
    binding.ReceiveTimeout = TimeSpan.FromMinutes( 10 );
    binding.AllowCookies = false;
    binding.BypassProxyOnLocal = false;
    binding.HostNameComparisonMode = HostNameComparisonMode.StrongWildcard;
    binding.MessageEncoding = WSMessageEncoding.Text;
    binding.TextEncoding = System.Text.Encoding.UTF8;
    binding.TransferMode = TransferMode.Buffered;
    binding.UseDefaultWebProxy = true;
    return new MyServiceSoapClient( binding, new EndpointAddress( "http://www.mysite.com/MyService.asmx" ) );
}

Altri suggerimenti

Se siete interessati a eliminare l'utilizzo del Sistema.ServiceModel sezione del web.configurazione di IIS hosting, ho postato un esempio di come farlo qui (http://bejabbers2.blogspot.com/2010/02/wcf-zero-config-in-net-35-part-ii.html).Mi mostra come personalizzare un ServiceHost per creare metadati e wshttpbinding endpoint.Io lo faccio in un general purpose modo che non richiede codifica aggiuntiva.Per coloro che non sono immediatamente effettuare l'aggiornamento .NET 4.0 questo può essere molto utile.

Ecco, questa è completo e codice di lavoro.Penso che vi aiuterà molto.Ho fatto una ricerca e non trova un codice completo ecco perché ho provato a mettere complete e codice di lavoro.Buona fortuna.

public class ValidatorClass
{
    WSHttpBinding BindingConfig;
    EndpointIdentity DNSIdentity;
    Uri URI;
    ContractDescription ConfDescription;

    public ValidatorClass()
    {  
        // In constructor initializing configuration elements by code
        BindingConfig = ValidatorClass.ConfigBinding();
        DNSIdentity = ValidatorClass.ConfigEndPoint();
        URI = ValidatorClass.ConfigURI();
        ConfDescription = ValidatorClass.ConfigContractDescription();
    }


    public void MainOperation()
    {
         var Address = new EndpointAddress(URI, DNSIdentity);
         var Client = new EvalServiceClient(BindingConfig, Address);
         Client.ClientCredentials.ServiceCertificate.Authentication.CertificateValidationMode = X509CertificateValidationMode.PeerTrust;
         Client.Endpoint.Contract = ConfDescription;
         Client.ClientCredentials.UserName.UserName = "companyUserName";
         Client.ClientCredentials.UserName.Password = "companyPassword";
         Client.Open();

         string CatchData = Client.CallServiceMethod();

         Client.Close();
    }



    public static WSHttpBinding ConfigBinding()
    {
        // ----- Programmatic definition of the SomeService Binding -----
        var wsHttpBinding = new WSHttpBinding();

        wsHttpBinding.Name = "BindingName";
        wsHttpBinding.CloseTimeout = TimeSpan.FromMinutes(1);
        wsHttpBinding.OpenTimeout = TimeSpan.FromMinutes(1);
        wsHttpBinding.ReceiveTimeout = TimeSpan.FromMinutes(10);
        wsHttpBinding.SendTimeout = TimeSpan.FromMinutes(1);
        wsHttpBinding.BypassProxyOnLocal = false;
        wsHttpBinding.TransactionFlow = false;
        wsHttpBinding.HostNameComparisonMode = HostNameComparisonMode.StrongWildcard;
        wsHttpBinding.MaxBufferPoolSize = 524288;
        wsHttpBinding.MaxReceivedMessageSize = 65536;
        wsHttpBinding.MessageEncoding = WSMessageEncoding.Text;
        wsHttpBinding.TextEncoding = Encoding.UTF8;
        wsHttpBinding.UseDefaultWebProxy = true;
        wsHttpBinding.AllowCookies = false;

        wsHttpBinding.ReaderQuotas.MaxDepth = 32;
        wsHttpBinding.ReaderQuotas.MaxArrayLength = 16384;
        wsHttpBinding.ReaderQuotas.MaxStringContentLength = 8192;
        wsHttpBinding.ReaderQuotas.MaxBytesPerRead = 4096;
        wsHttpBinding.ReaderQuotas.MaxNameTableCharCount = 16384;

        wsHttpBinding.ReliableSession.Ordered = true;
        wsHttpBinding.ReliableSession.InactivityTimeout = TimeSpan.FromMinutes(10);
        wsHttpBinding.ReliableSession.Enabled = false;

        wsHttpBinding.Security.Mode = SecurityMode.Message;
        wsHttpBinding.Security.Transport.ClientCredentialType = HttpClientCredentialType.Certificate;
        wsHttpBinding.Security.Transport.ProxyCredentialType = HttpProxyCredentialType.None;
        wsHttpBinding.Security.Transport.Realm = "";

        wsHttpBinding.Security.Message.NegotiateServiceCredential = true;
        wsHttpBinding.Security.Message.ClientCredentialType = MessageCredentialType.UserName;
        wsHttpBinding.Security.Message.AlgorithmSuite = System.ServiceModel.Security.SecurityAlgorithmSuite.Basic256;
        // ----------- End Programmatic definition of the SomeServiceServiceBinding --------------

        return wsHttpBinding;

    }

    public static Uri ConfigURI()
    {
        // ----- Programmatic definition of the Service URI configuration -----
        Uri URI = new Uri("http://localhost:8732/Design_Time_Addresses/TestWcfServiceLibrary/EvalService/");

        return URI;
    }

    public static EndpointIdentity ConfigEndPoint()
    {
        // ----- Programmatic definition of the Service EndPointIdentitiy configuration -----
        EndpointIdentity DNSIdentity = EndpointIdentity.CreateDnsIdentity("tempCert");

        return DNSIdentity;
    }


    public static ContractDescription ConfigContractDescription()
    {
        // ----- Programmatic definition of the Service ContractDescription Binding -----
        ContractDescription Contract = ContractDescription.GetContract(typeof(IEvalService), typeof(EvalServiceClient));

        return Contract;
    }
}

Non è facile sul server lato..

Per il lato client, è possibile utilizzare ChannelFactory

Tutti WCF configurazione può essere fatto a livello di programmazione.Quindi è possibile creare server e client senza un file di configurazione.

Vi consiglio il libro "la Programmazione di Servizi WCF" di Juval Lowy, che contiene molti esempi di configurazione programmatica.

E ' molto facile da fare su entrambi i client e lato server.Juval Lowy il libro è un eccellente esempio.

Il tuo commento su i file di configurazione, direi che i file di configurazione sono un uomo povero secondo a farlo in codice.I file di configurazione sono grandi quando il controllo di ogni client che si connette al server e assicurarsi che siano aggiornati, e che gli utenti non possono trovare e cambiare qualcosa.Trovo il file di configurazione WCF modello limitante, moderatamente difficile per la progettazione e la manutenzione incubo.Tutto sommato, penso che è stata molto scarsa decisione da parte di MS per rendere il file di configurazione predefinito modo di fare le cose.

EDIT:Una delle cose che non puoi fare con il file di configurazione è quello di creare servizi con i non-costruttori predefiniti.Questo porta a static/variabili globali e singleton e altri tipi di non-senso in WCF.

Ho trovato il post di blog al link qui sotto intorno a questo argomento molto interessante.

Un'idea che mi piace è quella di essere in grado di passare solo in un'associazione o di comportamento o l'indirizzo sezione XML di configurazione appropriato WCF oggetto e farla gestire l'assegnazione delle proprietà - attualmente non è possibile fare questo.

Come altri sul web sto avendo problemi che necessitano di mio WCF implementazione di utilizzare un file di configurazione diverso rispetto a quello del mio hosting applicazione (che è una .NET 2.0 Windows service).

http://salvoz.com/blog/2007/12/09/programmatically-setting-wcf-configuration/

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top