Hallo,
ich habe ein merkwürdiges Problem. Es gibt eine https Seite (URL kann ich nicht nennen) von der ich Daten beziehen soll (C#, 3.5)
Das Problem ist, wenn ich diese URL im Browser über https öffne, bekomme ich eine Antwort. Wenn ich die gleiche URL versuche über ein HttpWebRequest im Code anzufragen, bekomme ich immer ein Timeout.
Das ist ziemlich schwammig ich weiß, aber mir fehlen aktuell Ideen.
Ich hab für problematische Zertifikate ein
System.Net.ServicePointManager.ServerCertificateValidationCallback += delegate(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors)
{
// Allow to pass
return true;
};
Callback installiert, aber so weit kommt die Anfrage nicht.
Der Code nur für die Anfrage (nicht die Response ist hier:)
HttpWebRequest request = null;
if (m_type == PostTypeEnum.Post)
{
Uri uri = new Uri(url);
request = (HttpWebRequest)WebRequest.Create(uri);
request.Method = "POST";
request.ContentType = "application/x-www-form-urlencoded";
request.ContentLength = postData.Length;
using (Stream writeStream = request.GetRequestStream()) //<---------- hier hängts
{
UTF8Encoding encoding = new UTF8Encoding(true);
byte[] bytes = encoding.GetBytes(postData);
writeStream.Write(bytes, 0, bytes.Length);
}
}
else
{
Uri uri = new Uri(url + "?" + postData);
request = (HttpWebRequest)WebRequest.Create(uri);
request.Method = "GET";
}
Das Programm kommt über GetRequestStream nicht hinaus.
Ich habe keine Probleme andere http UND auch https Seiten mit dem Tool zu rufen, bekomme dort auch ein Response, es kann also kein generelles SSL Problem sein.
Für Ideen wäre ich dankbar
Life is a short
Nutzt Dein Browser ggf. 'nen Proxy und Teil Programm eben nicht?
Bye,
Knick
Debuggers don't remove Bugs, they only show them in Slow-Motion.
Hallo,
nein, keine Proxy eingetragen.
Das müsste auch ein sehr spezieller Proxy sein, da er ja andere Seiten über https nicht blockiert.
Das komische ist, wenn ich manuell die Seite pinge und dann die aufgelöste IP nehme, so komme ich da durch, werde nur mit einem ungültigen Zertifikat konfrontiert, weil dieses nicht auf die IP ausgestellt ist.
Life is a short
Hallo,
Du setzt die ContentLength
bereits, bevor Du weisst, wie lang Deine Daten eigentlich sind.
Denn das von encoding.GetBytes(postData)
gelieferte Bytearray hat eine andere Länge als der String. Setze also die ContentLength
erst nach dem Umwandeln des Strings auf die Länge des resultierenden Bytearrays.
Gruß, MarsStein
Non quia difficilia sunt, non audemus, sed quia non audemus, difficilia sunt! - Seneca
Schau Dir mal den
> an...das ist eine gute Moeglichkeit, damit Du https Probleme analysieren kannst.
Eventuell musst Du sonst mit anderen Tools arbeiten, um die Header anzuschauen...
Habe ich schon, da es https ist, macht es einige Probleme, dies zutun. Ich habe den SSL Tunnel bei Fiddler aktiviert und eine Zertifikat zum Abfangen der Kommunikation erzeugt. Es kommt jedoch einfach nichts vom Server zurück. Wenn ich lange genug warte, dann gibt es einen Timeout. Ich weiß nicht, ob ich dem Server noch etwas senden muss.
Das komische ist, im Firefox kann ich auf die Seite zugreifen. Im Fiddler gibt es jedoch nichts spannendes zu sehen. Replizieren kann ich die SSL Kommunikation manuell jedoch ziemlich schlecht
@MarsStein. Das stimmt. Ich teste aktuelle mit dem GET code Pfad ohne Post Daten und ich bekomme keine Antwort vom Server.
Ich hab schon als User Agent den String vom Firefox genommen, um auszuklammern, dass der Server dort penibel ist. Nix gebracht.
Ich habe auch mal das Codesnippet von hier genommen:
C#: How to accept an invalid SSL certificate programmatically
Alle Server gehen, bis auf den einen
Life is a short
Wenn du im Fiddler die beiden Anfragen hast - kannst du sie direkt miteinander vergleichen - dann solltest du sofort sehen, wo der Unterschied liegt.
Achte auch auf Header-Daten. Und prüfe die URL lieber nochmal ganz sorgfältig.
Der Vorteil der Klugheit liegt darin, dass man sich dumm stellen kann - umgekehrt ist das schon schwieriger (K. Tucholsky)
Das Problem mit Internet-Zitaten ist, dass sie oftmals zu unrecht als authentisch angenommen werden. (K. Adenauer)
Werd ich nochmal heute Nachmittag angucken.
Dieser Server hat seine URL umgestellt. Es gibt eine alte https URL und eine neue. Auf die neue komme ich nicht mehr drauf, auf die alte schon.
Die OpenSSL Version hat sich zwischen den beiden URLs geändert. Ich überlege gerade, ob vielleicht C# und .net 3.5 vielleicht mit SSL V3 oder mit irgendetwas anderem Probleme hat.
Das irritierende ist: Beide Seiten haben das gleiche Zertifikat und doch geht die eine Seite und die andere nicht.
Life is a short
Ok, machen wir es noch wesentlich komplizierter:
Wenn ich über den Domain namen gehe, so habe ich das Timeout. Wenn ich jedoch über die IP gehe, so funktioniert es.
Ich kapiere nicht, ob es DNS Problem sein soll, oder nicht. Wenn ich nämlich C# benutze, um die IP von der Domain zu bekommen:
IPHostEntry he = Dns.GetHostEntry("domain.de");
url = @"https://"+he.AddressList[0];
So kann ich über die IP auf den Server. Kriege dann natürlich unsicheres Zertifikat usw, weil die IP mit dem Domainnamen nicht übereinstimmt.
Also DNS kann scheinbar korrekt aufgelöst werden, aber ohne die Umweg über die IP dann doch nicht?
Life is a short
Das ist in der Tat alles etwas merkwürdig, aber sicher gibt es eine ganz einfache Lösung dafür.
Versuche dir für Debuggingzwecke ein Miniprojekt zu erstellen, das nichts anderes tut, als den Server anzufragen und auf die Antwort zu warten.
Nimm Fiddler (oder falls du gut damit umgehen kannst) NetMon und analysiere die Anfragen (sie sollten weitgehend identisch sein). Im Zweifelsfall bilde die Anfrage exakt in C# nach (nur um sicher zu gehen).
Außerdem versuche mal IPv6 abzuschalten - eventuell macht das ärger (zumindest hab ich das schon mal gesehen).
Du kannst auch die Anfragen aus .NET und deinem Browser direkt mit Fiddler wiederholen - musst also nicht zwingen diese Programme nutzen.
Wenn das eine Möglichkeit für dich ist: Versuche .NET 4
Der Vorteil der Klugheit liegt darin, dass man sich dumm stellen kann - umgekehrt ist das schon schwieriger (K. Tucholsky)
Das Problem mit Internet-Zitaten ist, dass sie oftmals zu unrecht als authentisch angenommen werden. (K. Adenauer)
Also das mit der Domain ist weiterhin ungeklärt, ich bin aber weiter, wenn ich mit der IP auf den Server zugreifen.
Ich generiere eine XML aus C#, welche im Header das Encoding Tag für utf 16 hat
<?xml version=""1.0"" encoding=""UTF-16""?>
konvertiere es später in UTF8, wenn ich es mit POST an den Server sende. Bei dem alten Server funktioniert das, bei dem neuen Server nicht.
Dort kann ich, egal welches Encoding ich im XML Tag einstelle nichts machen. Erst wenn ich das ganze XML Tag entferne, scheint es zu funktionieren.
Klingt das nach einem Client oder nach einem Server Problem?
Life is a short