| 

.NET C# Java Javascript Exception

2
Hallo Leute,
ich bin auf der Suche nach einer Möglichtkeit, den Firefox so wie den IE zu instanziieren und in HTML- Forms zu schreiben. Ich zeige euch mal ein Bespiel für den IE:

Dim oIE As Object
oIE = CreateObject("InternetExplorer.Application")

While oIE.Busy
End While

oIE.visible = True
oIE.Navigate("http://website.de/")

While oIE.ReadyState <> 4
End While

Dim se
Dim i1 As Single

se = oIE.Document.getElementsByName("username")
For i1 = 0 To se.Length - 1
se(i1).value = "ADMIN"
Next

se = oIE.Document.getElementsByName("password")
For i1 = 0 To se.length - 1
se(i1).value = "ADMIN"
Next

se = oIE.Document.getElementsByTagName("form")
se(0).submit()


Gibt es so etwas auch für den Firefox? Ich würde am liebsten den Firefox Portable in meinen Anwendungspfad kopieren und diesen dann auch nutzen.

Gruß Spicejam
News:
14.07.2010
spicejam 853 2 6
Reicht das Webbrowser-Control nicht?
gfoidl 14.07.2010
Das Webbrowser Control ist auch nur ein Wrapper rund um das IE COM-Objekt.
klaus_b 14.07.2010
Ja Klaus, das weiß ich ;-)
Aber in Forms schreiben und submitten geht damit wunderbar.
gfoidl 14.07.2010
2 Antworten
4
Falls du vor hast dich auf einer WebSeite einzuloggen um dort Daten abzurufen oder zu speichern würde ich dir von einer "Fernsteuerung" mittels IE oder Firefox abraten. Wir haben hier auf Arbeit damit einige schlechte Erfahrungen gemacht.

Eine rosbute Alternative wäre die System.Net.WebRequest-Klasse die auch Sessions und Cookies unterstützt. Sie erlaubt es einen eigenen HTTP-Client zu entwickeln.

Ich habe mir Hilfsklasse geschrieben die ich dir hier mal posten möchte. Sie ist nicht der weißheit letzter schluss und müßte auch mal überarbeitet werden, aber sie zeigt dir, wie du vorgehen kannst.

using System;
using System.Diagnostics;
using System.IO;
using System.Net;
using System.Net.Security;
using System.Text;
using System.Threading;

namespace MyCompany.Netzwerkfunktionen.HTTP_Post_Request {
public class HTTP_Post_Request {
private String _UserAgent = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; InfoPath.2; .NET CLR 2.0.50727; .NET CLR 3.0.04506.648; .NET CLR 3.5.21022)";
private RemoteCertificateValidationCallback ignoreInvalidCertificateValidationCallback = delegate { return true; }; // aktzeptiert alle Zertifikate

//-----------------------------------------------------------------------
// CookieContainer - Instant erzeugen
//-----------------------------------------------------------------------
public CookieContainer objCookieContainer = new CookieContainer();

//==========================================================================
/// <summary>
/// Ruft einen Wert ab oder legt einen Wert fest, der angibt, ob auch vom Betriebssystem als unsicher betrachtete (SSL-)Zertifikate erlaubt werden
/// </summary>
public bool IgnoreInvalidCertificates {
get { return (ServicePointManager.ServerCertificateValidationCallback == ignoreInvalidCertificateValidationCallback); }
set { ServicePointManager.ServerCertificateValidationCallback = (value) ? ignoreInvalidCertificateValidationCallback : null; }
}

//==========================================================================
/// <summary>
/// Ruft einen Wert ab oder legt einen Wert fest, der angiebt, welcher HTTP-UserAgend-Header gesetzt werden soll
/// </summary>
public String UserAgent {
get { return this._UserAgent; }
set { this._UserAgent = value; }
}

//==========================================================================
[DebuggerStepThrough]
public string RequestPost(string url, string VIEWSTATE, string EVENTVALIDATION, string Method, string Referer, params WebPostEntry[] arrPostData) {
return RequestPost(url, VIEWSTATE, EVENTVALIDATION, Method, Referer, Encoding.UTF8, arrPostData);
}

//==========================================================================
[DebuggerStepThrough]
public string RequestPost(string url, string VIEWSTATE, string EVENTVALIDATION, string Method, string Referer, Encoding encoding, params WebPostEntry[] arrPostData) {
MemoryStream receiveStream = this.RequestPost_Stream(url, VIEWSTATE, EVENTVALIDATION, Method, Referer, encoding, arrPostData);
if (receiveStream != null && receiveStream.CanRead) {
StreamReader readStream = new StreamReader(receiveStream, encoding);
string strResponse = readStream.ReadToEnd();
readStream.Close();
receiveStream.Close();
receiveStream.Dispose();
return strResponse;
}
return "";
}

//==========================================================================
[DebuggerStepThrough]
public MemoryStream RequestPost_Stream(string url, string VIEWSTATE, string EVENTVALIDATION, string Method, string Referer, Encoding encoding, params WebPostEntry[] arrPostData) {
HttpWebResponse objResponse = default(HttpWebResponse);
HttpWebRequest objWR = default(HttpWebRequest);
Int16 retryCount = 0;

while (retryCount <= 1) {
try {
string strPostData = String.Empty;
if (arrPostData != null)
strPostData = WebPostEntry.FromArrayToString(arrPostData);

objWR = Method == "GET" & !string.IsNullOrEmpty(strPostData)
? (HttpWebRequest)WebRequest.Create(url + "?" + strPostData)
: (HttpWebRequest)WebRequest.Create(url);

objWR.CookieContainer = objCookieContainer;
objWR.UserAgent = this._UserAgent;
objWR.Method = Method.ToUpper();
objWR.Referer = Referer;
if (Method.ToUpper() == "POST" & !string.IsNullOrEmpty(strPostData)) {
objWR.ContentType = "application/x-www-form-urlencoded";
byte[] bytPostData = encoding.GetBytes(strPostData);
objWR.ContentLength = bytPostData.Length;
Stream objRequestStream = objWR.GetRequestStream();
objRequestStream.Write(bytPostData, 0, bytPostData.Length);
objRequestStream.Close();
}
objResponse = (HttpWebResponse)objWR.GetResponse();

if ((objResponse.StatusCode != HttpStatusCode.OK)) {
return null;
}
else {
const int bufferSize = 256;
byte[] buffer = new byte[bufferSize];

MemoryStream memStream = new MemoryStream();
using (Stream receiveStream = objResponse.GetResponseStream()) {
BinaryWriter bw = new BinaryWriter(memStream);
while (receiveStream.CanRead) {
int countBytesRead = receiveStream.Read(buffer, 0, bufferSize);
if (countBytesRead == 0) break;
bw.Write(buffer, 0, countBytesRead);
}
bw.Flush();
}
if (memStream.CanSeek)
memStream.Position = 0;
return memStream;
}
}
catch (Exception ex) {
if (retryCount <= 1 && ex.Message.Contains("502") && ex.Message.Contains("Bad Gateway")) {
retryCount++;
Thread.Sleep(1000);
}
else {
throw;
}
}
finally {
if (objResponse != null)
objResponse.Close();
}
}
return null;
}
}
}

namespace MyCompany.Netzwerkfunktionen.HTTP_Post_Request {
public class WebPostEntry {
public string Name;
public string Value;

//==========================================================================
[DebuggerStepThrough]
public WebPostEntry(string name, string value) {
this.Name = name;
this.Value = value;
}

//==========================================================================
[DebuggerStepThrough]
public override string ToString() {
return "&" + System.Web.HttpUtility.UrlEncode(this.Name) + "=" + System.Web.HttpUtility.UrlEncode(this.Value, System.Text.Encoding.GetEncoding(1250));
}

//==========================================================================
[DebuggerStepThrough]
public static string FromArrayToString(WebPostEntry[] list) {
string tempRC = "";
foreach (var entry in list) {
if ((entry == null)) continue;
tempRC += entry.ToString();
}
if (tempRC.StartsWith("&")) tempRC = tempRC.Remove(0, 1);
return tempRC;
}
}
}


Verwenden kannst du das ganze dann so:

strResult = (requestObject.RequestPost("https://yourURL.xxx/page.aspx", "", "", "POST", "https://yourReferer.aspx/",
new WebPostEntry("var1", var1),
new WebPostEntry("var2", var2),
new WebPostEntry("var3", var3)
));


Man sollte jedoch ein wenig Grundwissen im Bereich von Webentwicklung und dem HTTP-Protocoll mitbrinen.
14.07.2010
Floyd 14,6k 3 9
1
14.07.2010
DaSpors 4,2k 2 8
Also Leute nach langem hin und her hab ich noch immer keine Lösung gefunden. Sorry das ich mich so spät melde, war beschäftigt. Ich will deshalb eine Firefox Instanz, weil der IE durch richtlinen gesperrt sein könnte. Da die Website, die ich ansteuern und auch ANZEIGEN möchte, ein Ärzteportal ist und ich den Ärzten einfach nur eine komfortable Lösung zu Verfügung stellen muss, brauche ich eine anderen Instanz als den IE. Ich glaube das wird nicht so einfach wie es scheint.
spicejam 19.07.2010
Also nach deinem Kommentar weiss ich ehrlich nicht, warum Du die Antwort von Floyd akzeptierst. Das ist ja gerade KEINE Anzeige, sondern NUR Download?!
DaSpors 26.07.2010
1
Richtig, aber das mit dem Anzeigen ist auch eine neue Anforderung die in der Fragestellung nicht auftauchte :D
Floyd 26.07.2010
1
Die Antwort von DaSpors mit "http://geckofx.org/" ist eigendlich genau das was du brauchst.
Floyd 26.07.2010

Stelle deine .net-Frage jetzt!
TOP TECHNOLOGIES CONSULTING GmbH