Wie kann ich programmgesteuert angeben HTTPS für BasicHttpBinding?

Ich versuche, Sie zu konsumieren eines web service .NET 4 (Visual Studio 2010), erfordert HTTPS und Authentifizierung mit einem client-Zertifikat. Derzeit Schreibe ich eine Konsole, nur um zu beweisen, das Konzept, aber ich habe Probleme mit dem Programm erkennen, dass es sollte mit https. Mindestens das ist, was die Fehlermeldung schon sagt:

Ist ein Fehler aufgetreten, während der HTTP-request, https://. Dies könnte aufgrund der Tatsache, dass das server-Zertifikat nicht ordnungsgemäß konfiguriert ist, mit HTTP.SYS im HTTPS-Fall. Dies könnte auch verursacht werden durch ein Missverhältnis der Sicherheit der Bindung zwischen dem client und dem server.

Hier ist der Beispiel-code, den ich verwende :

class Program
{
    static void Main(string[] args)
    {
        try
        {
            BasicHttpBinding binding = new BasicHttpBinding();
            binding.Security.Mode = BasicHttpSecurityMode.Transport;
            binding.Security.Transport.ClientCredentialType = HttpClientCredentialType.Certificate;

            Uri baseAddress = new Uri("https://<host>:<port>/<endpoint>");

            var certificate = new X509Certificate2("<localpath to certificate>.p12", "<password>");
            EndpointAddress endpointAddress = new EndpointAddress(baseAddress);

            ChannelFactory<LinePortType> factory = new ChannelFactory<LinePortType>(binding, endpointAddress);
            factory.Credentials.ClientCertificate.Certificate = certificate;
            LinePortType proxy = factory.CreateChannel();


            var header = new ctSoapHeaderMsg();
            var response = new object();
            var request = new PerformServiceRequest(header, "<string>");
            var responseCode = proxy.PerformService(request);

            Console.WriteLine("Response Code :" + responseCode.ToString());
            Console.WriteLine("Response :" + response.ToString());

        }
        catch (Exception exception)
        {
            Console.WriteLine(exception.Message);
        }

        Console.ReadLine(); //Pause
    }
}

Habe ich ersetzt ein paar der empfindlichen strings mit Platzhaltern.

Ganz vielleicht, kann das Problem bei mir nicht in der Lage, konfigurieren Sie die Zertifikat richtig. Schließlich hoffe ich, haben diese zuvor von einem lokalen Zertifikatspeicher, so dass ich nicht haben, um geben Sie das Passwort in den code oder Konfiguration.

Den LinePortType ist eine Service-Referenz basierend auf einer lokalen WSDL. Da der WSDL-war für eine Produktionsumgebung, ich bin ändern der Endpunkt Referenz der UAT-Umgebung, statt.


Auf Empfehlung von srsyogesh, ich habe aktualisiert, um zu verwenden, WSHttpBinding, aber ich bin noch immer der gleiche Fehler.

Den code innerhalb des try ist nun auf der Suche wie:

var binding = new WSHttpBinding();
binding.Security.Mode = SecurityMode.Transport;
binding.Security.Transport.ClientCredentialType = HttpClientCredentialType.Certificate;

var baseAddress = new Uri("https://<host>:<port>/<endpoint>");
var endpointAddress = new EndpointAddress(baseAddress);

var client = new LinePortTypeClient(binding, endpointAddress);

client.ClientCredentials.ClientCertificate.SetCertificate(StoreLocation.CurrentUser, StoreName.My, X509FindType.FindByIssuerName, "<issuername>");

var header = new ctSoapHeaderMsg();
var response = new object();
var responseCode = client.PerformTelstraSQ(ref header, "<string>", out response);

Console.WriteLine("Response Code :" + responseCode);
Console.WriteLine("Response :" + response);

InformationsquelleAutor Reuben | 2013-06-14

Schreibe einen Kommentar