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
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sollten Sie NICHT verwenden Sie das BasicHttpBinding, aber BasicHttpsVerbindlich. Es wird das problem lösen, denke ich.
InformationsquelleAutor Yoda
Können Sie die Verwendung von HTTPS mit WsHttpBinding und nicht mit BasicHttpBinding. Stellen Sie sicher, dass Ihre server gestartet wird mit der Konfiguration, die Sie verwenden möchten, und dann versuchen, eine Verbindung vom client.
msdn.microsoft.com/en-us/library/ms731074.aspx , Sie können finden die Informationen über transport-security mit Zertifikat-Authentifizierung, die Sie versuchen . Ich versuche, aus einer Probe , einmal gelang veröffentlichen Sie das gleiche . Auch sind Sie in der Lage, laden Sie die Metadaten (client-config-Datei vom wcf-service), wird es möglich sein, für Sie, es zu teilen ?
Der service ist ein web service, soap-basiert, so dass alles, was ich habe zu gehen, ist die WSDL, die Sie zur Verfügung gestellt haben. Leider bin ich nicht in der Lage, es zu teilen. Ich habe eigentlich erfolgreiche Kommunikation mit dem service in PHP. Ich bin versucht, herauszufinden, wie es gemacht wird .NET.
Ich bin nicht sicher, weil ohne wsdl-oder client-Konfiguration gegeben ist , ist es sehr schwierig das problem zu finden . Auch kann u überprüfen, ob die Lösung in social.msdn.microsoft.com/forums/en-US/wcf/thread/... und blogs.msdn.com/b/james_osbornes_blog/archive/2010/12/10/... Ihnen zu helfen.
Ich bin mir sehr sicher, dass ein client mit "BasicHttpBinding" kann eine Verbindung über HTTPS, indem Sie
binding.Security.Mode = BasicHttpSecurityMode.Transport;
pro original-code.InformationsquelleAutor srsyogesh