90 votes

Configuration WCF sans fichier de configuration

Quelqu'un connaît-il un bon exemple de la façon d'exposer un service WCF de manière programmatique sans utiliser de fichier de configuration ? Je sais que le modèle d'objet de service est beaucoup plus riche maintenant avec WCF, donc je sais que c'est possible. Je n'ai simplement pas vu d'exemple de la façon de le faire. Inversement, j'aimerais voir comment consommer sans fichier de configuration est également fait.

Avant que quelqu'un ne demande, j'ai un besoin très spécifique de faire cela sans fichiers de configuration. Normalement, je ne recommanderais pas une telle pratique, mais comme je l'ai dit, il y a un besoin très spécifique dans ce cas.

115voto

chaiguy Points 7615

Consommer un service web sans fichier de configuration est très simple, comme je l'ai découvert. Vous devez simplement créer un objet de liaison et un objet d'adresse et les passer soit au constructeur du proxy client, soit à une instance générique de ChannelFactory. Vous pouvez regarder l'app.config par défaut pour voir quels paramètres utiliser, puis créer une méthode d'aide statique quelque part qui instancie votre 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" ) );
}

19voto

John Wigger Points 721

Si vous souhaitez éliminer l'utilisation de la section System.ServiceModel dans le web.config pour l'hébergement IIS, j'ai publié un exemple de la manière de le faire ici ( http://bejabbers2.blogspot.com/2010/02/wcf-zero-config-in-net-35-part-ii.html ). Je montre comment personnaliser un ServiceHost pour créer à la fois des métadonnées et des endpoints wshttpbinding. Je le fais d'une manière générale qui ne nécessite pas de codage supplémentaire. Pour ceux qui ne font pas immédiatement la mise à jour vers .NET 4.0, cela peut être très pratique.

14voto

S. M. Khaled Reza Points 141

Voilà, c'est un code complet et fonctionnel. Je pense qu'il vous aidera beaucoup. J'ai cherché et je n'ai jamais trouvé un code complet, c'est pourquoi j'ai essayé de mettre un code complet et fonctionnel. Bonne chance.

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

}

5voto

Gulzar Nazim Points 35342

Ce n'est pas facile pour le serveur côté ..

Du côté client, vous pouvez utiliser ChannelFactory

3voto

Paul Lalonde Points 3940

Toute la configuration WCF peut être faite par programme. Il est donc possible de créer des serveurs et des clients sans fichier de configuration.

Je recommande le livre "Programming WCF Services" de Juval Lowy, qui contient de nombreux exemples de configuration programmatique.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X