Frage

Kennt jemand ein gutes Beispiel, wie man einen WCF-Dienst programmgesteuert ohne Verwendung einer Konfigurations-Datei?Ich weiß, das service-Objekt-Modell ist viel reicher jetzt mit WCF, so dass ich weiß, es ist möglich.Ich habe nur nicht gesehen, ein Beispiel dafür, wie dies zu tun.Umgekehrt, würde ich mag, um zu sehen, wie aufwendig ohne eine Konfigurationsdatei als gut getan.

Bevor jemand fragt, ich habe eine sehr spezifische Notwendigkeit, dies zu tun, ohne Konfigurationsdateien.Würde ich normalerweise nicht empfehlen, eine solche Praxis, aber wie gesagt, es ist eine sehr spezifische Bedürfnisse in diesem Fall.

War es hilfreich?

Lösung

Verbrauchen einen Webdienst ohne Konfigurationsdatei ist sehr einfach, wie ich entdeckt habe. Sie müssen lediglich eine verbindliche Objekt und Adressobjekt erstellen und diese entweder an den Konstruktor des Client-Proxy oder auf eine generische Channel Instanz übergeben. Sie können an dem Standard app.config schauen, um zu sehen, welche Einstellungen zu verwenden, dann eine statische Hilfsmethode irgendwo erstellen, die Ihre Proxy-instanziiert:

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

Andere Tipps

Wenn Sie die Verwendung des System.ServiceModel Abschnitts bei der Beseitigung in der web.config für IIS-Hosting interessiert sind, habe ich ein Beispiel geschrieben, wie man das hier ( http://bejabbers2.blogspot.com/2010/02/wcf-zero-config -in-net-35-Teil-ii.html ). Ich zeige, wie ein Servicehost anpassen beide Metadaten und wsHttpBinding Endpunkte zu erstellen. Ich mache es in einer Allzweck-Art und Weise, die nicht zusätzliche Codierung erforderlich ist. Für diejenigen, die auf .NET 4.0 nicht sofort aktualisieren sind, können diese sehr praktisch sein.

Hier ist der komplette und Arbeitscode. Ich denke, es wird Ihnen helfen, eine Menge. Ich war auf der Suche und findet nie einen vollständigen Code, deshalb habe ich vollständig und Arbeits Code zu setzen versucht. Viel Glück.

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

Es ist nicht einfach auf dem Server Seite ..

Für Client-Seite können Sie Channel

können alle WCF-Konfiguration programmatisch erfolgen. So ist es möglich, beide Server und Clients ohne eine Konfigurationsdatei zu erstellen.

Ich empfehle das Buch „Programming WCF Services“ von Juval Löwy, die viele Beispiele für programmatische Konfiguration enthält.

Es ist sehr einfach sowohl zu tun, den Client und die Server-Seite. Juval Löwy Buch hat hervorragende Beispiele.

In Bezug auf Ihre Kommentare über die Konfigurationsdateien, würde ich sagen, dass die Konfigurationsdateien ein Armer zweit sind es im Code zu tun. Konfigurationsdateien sind groß, wenn Sie jeden Client steuern, die auf dem Server verbinden und sicherstellen, dass sie aktualisiert sind, und dass die Nutzer sie nicht finden und nichts ändern. Ich finde das WCF-Konfigurationsdatei Modell zu beschränken, leicht schwierig zu entwerfen und eine Wartung Alptraum. Alles in allem denke ich, dass es eine sehr schlechte Entscheidung von MS war die Konfigurationsdateien die Standard-Art, die Dinge zu machen.

EDIT: Eines der Dinge, die Sie nicht mit der Konfigurationsdatei tun können, ist Dienst mit nicht-Standardkonstruktoren zu erstellen. Dies führt zu einer statischen / globalen Variablen und Singletons und andere Arten von Nicht-Sinn in WCF.

fand ich die Blog-Post auf dem Link unten, um dieses Thema sehr interessant.

Eine Idee, die ich mag, dass ist die Lage passieren nur in einer Bindung oder Verhalten oder Adresse XML Abschnitt von der Konfiguration an dem entsprechenden Objekt WCF und lassen Sie es die Zuordnung der Eigenschaften verarbeiten - derzeit können Sie dies nicht tun.

Wie andere im Web ich Probleme habe meine WCF Implementierung um benötigen eine andere Konfigurationsdatei als die von meiner Hosting-Anwendung zu verwenden (das ist ein .NET 2.0 Windows-Dienst ist).

http://salvoz.com/blog/ 2007/12 / 09 / programmatisch-Einstellung-wcf-Konfiguration /

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top