Question

Est-ce quelqu'un connais un bon exemple de la façon d'exposer un service WCF par programmation sans l'utilisation d'un fichier de configuration?Je sais que le modèle objet du service est beaucoup plus riche maintenant avec WCF, donc je sais que c'est possible.J'ai juste pas vu un exemple de la façon de le faire.À l'inverse, je voudrais voir comment consommer sans un fichier de configuration se fait ainsi.

Avant que quiconque demande, j'ai des besoins très particuliers de le faire sans les fichiers de configuration.Je ne serait pas normalement recommander une telle pratique, mais comme je l'ai dit, il y a un besoin spécifique dans ce cas.

Était-ce utile?

La solution

La consommation d'un service web sans fichier de configuration est très simple, comme je l'ai découvert.Il vous suffit de créer un objet de liaison et l'adresse de l'objet et de les transmettre, soit par le constructeur de la client proxy ou d'un générique ChannelFactory instance.Vous pouvez regarder le défaut d'application.config pour voir quels sont les paramètres à utiliser, puis créer un statique méthode d'aide 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" ) );
}

Autres conseils

Si vous êtes intéressé par l'élimination de l'utilisation du Système.ServiceModel section dans le site web.config pour l'hébergement IIS, j'ai posté un exemple de la façon 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 les métadonnées et les wshttpbinding points de terminaison.Je le fais dans un sens qui ne nécessite pas de codage supplémentaire.Pour ceux qui ne sont pas immédiatement la mise à niveau .NET 4.0, ce peut être assez pratique.

Ici, c'est complet et code de travail.Je pense que ça va vous aider beaucoup.J'étais à la recherche et à jamais trouve un code complet c'est pourquoi j'ai essayé de mettre complète et code de travail.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;
    }
}

Il n'est pas facile sur le serveur côté..

Pour le côté client, vous pouvez utiliser ChannelFactory

Toutes les configuration WCF peut être fait par programmation.Il est donc possible de créer des serveurs et des clients sans fichier de configuration.

Je vous recommande le livre "Programmation des Services WCF" par Juval Lowy, qui contient de nombreux exemples de programmation de la configuration.

Il est très facile à faire sur le client et côté serveur.Juval Lowy du livre a d'excellents exemples.

Quant à votre commentaire sur les fichiers de configuration, je dirais que les fichiers de configuration sont un homme pauvre second à le faire dans le code.Les fichiers de Configuration sont grands quand vous contrôler, chaque client qui se connecte à votre serveur et assurez-vous qu'ils sont mis à jour, et que les utilisateurs ne peuvent pas les trouver et de changer quoi que ce soit.Je trouve la WCF fichier de configuration de modèle pour être limitatif, légèrement difficile à concevoir, et d'un entretien cauchemar.Dans l'ensemble, je pense que c'était une très mauvaise décision de MS pour rendre les fichiers de configuration par défaut façon de faire les choses.

EDIT:Une des choses que vous ne pouvez pas faire avec le fichier de configuration est de créer des services avec les constructeurs par défaut.Cela conduit à la statique/les variables globales et les singletons et d'autres types de non-sens dans la WCF.

J'ai trouvé le post de blog sur le lien ci-dessous autour de ce sujet très intéressant.

Une idée que j'aime, c'est que d'être en mesure de simplement passer dans une liaison ou de comportement ou de l'adresse du XML à partir de la configuration appropriée, la WCF objet et de le laisser gérer l'attribution de propriétés - actuellement vous ne pouvez pas faire cela.

Comme tous les autres sur le web, je vais avoir des questions autour du besoin de mon WCF mise en œuvre pour utiliser un fichier de configuration différent que celui de mon hébergement d'applications (qui est un .NET 2.0 service Windows).

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top