WCM Forum

WCM Forum (http://www.wcm.at/forum/index.php)
-   Programmierung (http://www.wcm.at/forum/forumdisplay.php?f=17)
-   -   VB ASP.NET Windows.Forms.WebBrowser funktioniert nicht richtig? (http://www.wcm.at/forum/showthread.php?t=205187)

void 07.12.2006 18:43

VB ASP.NET Windows.Forms.WebBrowser funktioniert nicht richtig?
 
hi @ll!

habe unter ASP.NET mit VB folgendes Problem:
Code:

<%@ Page Language="VB" AutoEventWireup="false" CodeFile="Default.aspx.vb" Inherits="_Default"
aspcompat="true"
%><%
      Dim webb As Windows.Forms.WebBrowser
      webb = New Windows.Forms.WebBrowser
      webb.Width = 298
      webb.Height = 168

      'funktioniert nicht:
      webb.Navigate("http://www.wcm.at")

      'funktioniert:
      webb.Navigate("about:blank")

      'funktioniert:
      webb.Navigate("C:\test.html")

      System.Threading.Thread.Sleep(3000)
      Response.Write(webb.DocumentText)
%>

hat jemand eine idee, warum es bei jenen seiten, welche mit "http://" beginnen, nicht funktioniert??

bin schon am verzweifeln!! danke!!

renew 08.12.2006 13:02

Hab zwar schon länger nimmer ASP.NET gecoded, aber laut MSDN machst du nichts falsches.

Was mich allerdings ein bisserl wundert ist: Was macht ein Webbrower aus: System.Windows.Forms auf einer ASP.NET Seite?

void 08.12.2006 21:39

hallo!

ich will über diese ASP.NET seite andere webseiten aufbereiten und wiedergeben (z.b. snapshots,...). und mit System.Windows.Forms.WebBrowser kann man ziemlich einfach einen snapshot machen...

aber du weißt auch nicht, warum das bei mir auf einmal nicht klappt - sicherheitseinstellungen eventuell?

renew 09.12.2006 11:34

Zitat:

Original geschrieben von void

aber du weißt auch nicht, warum das bei mir auf einmal nicht klappt - sicherheitseinstellungen eventuell?

Nein, leider. Hab außerdem mit .NET 2.0 noch gar nichts gemacht - und das Webbrowser is ja ein 2.0er Steuerlement.

Aber Sicherheitseinstellungen könnte ich mir sehr gut vorstellen. Stichwort Internet Zonen beim Internet Explorer. Evt. gibts da was ähnliches bei .NET was man noch konfigurieren muss.

Du kannst noch probieren Navigate mit einer URI aufzurufen. Sollte zwar zum normalen String keinen Unterschied machen, aber man kanns ja einfach ausprobieren.

void 09.12.2006 23:38

Zitat:

Original geschrieben von renew
Du kannst noch probieren Navigate mit einer URI aufzurufen. Sollte zwar zum normalen String keinen Unterschied machen, aber man kanns ja einfach ausprobieren.
das habe ich schon ausprobiert, hat aber leider den selben effekt...
werde dann am MO das mit den sicherheitseinstellungen untersuchen...

renew 10.12.2006 12:33

Hab vorhin gerade ein wenig in die Richtung mit Google gesucht und bin auf das hier gestoßen:
Zitat:

Can I use a WebBrowser control in a control embedded in an Internet Explorer web page?

I use a WebBrowser control in a Windows Forms control. When this control is used in an EXE, it works fine. But when I embed this control in a IE web page, the WebBrowser in it doesn't work (could not show any web page).

Why can't the WebBrowser control be used in this situation? Is there any work around?

Sorry, but that scenario was explicitly disabled for security reasons. This case opened up a number of interesting security concerns.

Could it be supported in future version? At this time, I could use other controls such as RichTextBox to show formatted text. But in future, I do want to show a web page in my program. My program is a control embeded in a IE web page.

This scenario is not supported by design. Due to the security concerns, I doubt this will be enabled for future versions.
evt. ist das der selbe Grund warum das bei einer ASP.NET Seite nicht funktioniert. Ist zwar irgendwie unlogisch und wiedermal toll, dass sowas nicht in der MSDN steht, aber ich fürchte in die Richtung wird dein Problem gehen....

void 10.12.2006 13:37

na toll :(
jedenfalls vielen dank...

dann werde ich einen workaround über ein externes programm machen oder so etwas ähnliches - jeden falls sehr mühsam.
was ich jedoch nicht verstehe ist, dass es als html-file angezeigt wird... seltsam - hoffentlich bringt der montag mehr aufschluss.

Biri 10.12.2006 22:20

hi,

was möchtest du denn genau machen?
nur zum laden einer http seite brauchst du kein browser control - eher fürs rendern - und das geht ja, nachdem deine appl. im browser läuft sowieso.
ev. ist das interessant für dich: http://www.csharp-station.com/HowTo/HttpWebFetch.aspx

...finds aber auch blöd, das sowas in MSDN nicht gleich explizit angeführt wird.

fg
hannes

void 11.12.2006 00:16

nein, leider...
in weiterer folge benötige ich auch das gerenderte html für einen webseitensnapshot :-)

Biri 11.12.2006 08:58

hi,

folgende suche: http://www.google.at/search?hl=de&rl...thout+ie&meta=
bring an 3. stelle leider nur ein kostenpflichtiges control.
Ev. sind die hits davor hilfreich, gefunden hab ich die angesprochenen beiträge auf gotdotnet aber nicht.

fg
hannes

void 12.12.2006 17:41

ja, habe leider auch nur kostenpflichtige tools/libs gefunden...

nichts desto trotz habe ich jetzt über umwege das gewünschte ergebnis erhalten (schwere geburt), indem ich "einfach" meinen ganzen webbrowser-code in eine DLL verpackt habe... warum es jetzt geht?! egal :smoke:

jedenfalls vielen dank an alle :bier:

renew 12.12.2006 20:07

Verstehe ich das richtig:
Du packst die System.Windows.Forms.WebBrowser und den ganzen sonstigen Code in eine "unmanaged" DLL rufst von dieser DLL die benötigten Methoden auf und dann funkt das ganze?

Das heißt soviel wie du umgehst die nicht dokumentierten "Sicherheitsfeatures" vom Webbrowser Control indem du es als DLL verwendest?

void 12.12.2006 22:41

hmmm, ja. ("unmanaged DLL" :confused:)

ich habe zwar gaaaaanz seltsame phänomene mit visual studio, aber ich habe es heute noch einmal explizit ausprobiert - es hat nur über die DLL funktionert.
wenn ich morgen zeit finde, werde ich es noch einmal probieren - bin nämlich heute draufgekommen, dass ich an vielen fehlern gar nicht schuld bin!! VS schließen und wieder öffnen und der fehler ist weg!!?! :eek: wie kann es so etwas geben?

Biri 13.12.2006 08:31

hallo,

warum "unmanaged" dll?
Auch eine dll kann managed code enthalten - das tut sie aber nicht, wenn man das webbrowser control verwendet, dieses ist nämlich unmanaged. .net 2.0 bietet zwar ein webbrowser control an (im gegensatz zu 1.x) - dieses ist aber nur ein wrapper über das "normale" unmanaged webbrwoser control. Ein richtiges managed Webbrowser Control gibt es meines Wissens nach leider nicht - hier wäre MS sehr gefragt.

Kommt mir komisch vor, dass es in einer dll ausgelagert funktionieren sollte, im Code direkt verwendet aber nicht. Hast du dabei das Control eh nicht vom Designer auf die Form gezogen? Versuch einfach mal es im Code zu instanziieren - das sollte dann das selbe sein, wie wenn du eine anderes Assembly (=Dll) einbindest.

Aja - so komisches Verhalten von Visual Studio hab ich auch ab und zu + ein Restart hilft dann. Ist auf meinem Firmen PC so, dass - wenn man 2 Visual Studio und Sql Server Management Studio geöffnet hat, "spinnt" Visual Studio - Menüs werden nicht mehr angezeigt, Kontextmenü geht nicht und anderes...
Weiß aber nicht woram es liegt (ev. am PC?) - zu Hause hab ich damit keine Probleme.

fg
hannes

renew 13.12.2006 10:18

Zitat:

Original geschrieben von Biri
hallo,

warum "unmanaged" dll?
Auch eine dll kann managed code enthalten - ...

aha, ist mir neu - aber man lernt ja nie aus. :)

void 13.12.2006 13:05

jetzt bin ich endgültig am verzweifeln...

doch nicht mehr :D

denke jetzt endgültig klarheit gefunden zu haben!! tut mir echt leid, dass ich euch da in die irre geführt habe (aber ihr hättet es ja auch selbst ausprobieren können ;))

aaaalso:
es funktioniert so und so!!!! (dll oder direkt gecodet)

also warum nicht gleich so?[list=1][*]besagte visual studio fehler
(wenn man dann andere wege ausprobiert und diese funktionieren, schließt man natürlich gleich auf "der vorherige weg muss falsch gewesen sein, da fehler")
[*]der "fehler" lag beim warten auf das abschließen des ladevorganges der website!
da unter ASP.NET "Application.DoEvents()" nicht funktioniert, habe ich es einfach weggelassen, was dazu geführt hat, dass die website nie geladen wurde... tja, was soll ich sagen :aio:[/list=1]hier der funktionierende code:
Code:

<%@ Page Language="VB" AutoEventWireup="false" CodeFile="Default2.aspx.vb" Inherits="Default2"
aspcompat="true"
%><%
      Dim webb As Windows.Forms.WebBrowser
      webb = New Windows.Forms.WebBrowser

      webb.Navigate("http://www.wcm.at")
      While Not webb.ReadyState = Windows.Forms.WebBrowserReadyState.Complete
          System.Windows.Forms.Application.DoEvents()
          Sleep(200)
      End While

      Response.Write(webb.DocumentText)
%>

und
Code:

Partial Class Default2
    Inherits System.Web.UI.Page

    Declare Sub Sleep Lib "kernel32" Alias "Sleep" (ByVal dwMilliseconds As Integer)

End Class

aber wie gesagt - danke für eure bemühungen!!

p.s.: dass es mit files geklappt hat, liegt wahrscheinlich an der sehr kurzen ladezeit
p.p.s.: ich hoffe (für euch und für mich), dass es das jetzt war und ich nicht wieder auf andere sachen draufkomme :D :cool:

Biri 13.12.2006 13:19

hi,

paar dinge fallen mir an dem code auf:

1. System.Windows.Forms.Application.DoEvents()
...hat in einer web Applikation nichts zu suchen.
Was soll es bewirken?
Bei Winforms bewirkt es, dass die Meldungsschleife die nächsten Meldungen abarbeitet - bei Web Applikationen gibt es keine solche Schleife. (Jedes Windows Prog. hat eine Meldungsschleife - bei C++ programieren unter Win. war das klar sichtbar, durch MFC wurde es etwas verborgen und bei .net ist das nun genz vom Programmierer versteckt - der internen Mechanismus funktioniert aber nachwievor so)

das "While Not webb.ReadyState = Windows.Forms.WebBrowserReadyState.Complete" ist korrekt.

2. Es gibt ein "System.Threading.Thread.Sleep(...), du brauchst also keine funktion aus der kernel32 dll einbinden.

fg
hannes

void 13.12.2006 13:50

hmmmm[list=1][*]wenn ich diese zeile auskommentiere, geht es nicht - gibt es einen anderen weg??[*]ja stimmt, sorry - habe zu viele versionen, da habe ich die ohne Threading.Thread.Sleep kopiert =)[/list=1]

renew 13.12.2006 16:13

Zitat:

Original geschrieben von Biri
hi,

paar dinge fallen mir an dem code auf:

1. System.Windows.Forms.Application.DoEvents()
...hat in einer web Applikation nichts zu suchen.

Nachdem das Webbrowser-Control ja eigentlich aus den Windows.Forms.... Paketen kommt kann ich mir schon vorstellen, dass das DoEvents() sich auf diese Webbrowser Klasse unter dem Windows.Forms Paket bezieht und daher notwendig ist.

Das war ja von mir schon von Anfang an die Frage, was das Webbrowser Control in einer ASP.NET Anwendung zu suchen hat. Aber nachdem er is für die interne Verarbeitung braucht - why not. :)

Biri 13.12.2006 16:34

stimmt!
das war blödsinn meinerseits.

Du verwendest ja ein Control aus dem Windows.Forms Namespace und dieses hat - wie alle WinForms Controls - natürlich schon eine Meldungsschleife.

sorry + fg
hannes

void 13.12.2006 16:36

missbrauch
 
na ja, bin ja gerne für andere lösungen offen, welche dann "passender" sind...

wie gesagt, bin für vorschläge gerne offen!! bis jetzt haut das ganz toll hin, da die website auch gerendert zur verfügung steht :D

void 02.01.2007 17:04

warum funktioniert .DrawToBitmap() nicht bei allen seiten??
 
hallo nochmal!

ich habe jetzt noch ein problem mit dem WebBrowser objekt: manche seiten lassen sich mithilfe der funktion "DrawToBitmap" nicht capturen??? warum nicht?
Code:

Public Class Form1

    Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        WebBrowser1.ScriptErrorsSuppressed = True
        WebBrowser1.Navigate("http://google.at")

        While Not WebBrowser1.ReadyState = WebBrowserReadyState.Complete
            Windows.Forms.Application.DoEvents()
            Threading.Thread.Sleep(100)
        End While

        Dim docimage As Bitmap = New Bitmap(WebBrowser1.Width, WebBrowser1.Height)
        WebBrowser1.DrawToBitmap(docimage, New Rectangle(0, 0, WebBrowser1.Width, WebBrowser1.Height))
        docimage.Save("c:\google.at.jpg", Drawing.Imaging.ImageFormat.Jpeg)
    End Sub
End Class

wenn ich anstatt google.at z.b. orf.at eingebe funktioniert alles wunderbar...

an was kann das liegen?

danke! :aio:

p.s.: für obrigen code: einfach form mit Webbrowser objekt namens "WebBrowser1" ;)

Biri 02.01.2007 19:30

hi,

anscheinend funktioniert diese methode nicht immer (DrawToBitmap) - versuch mal folgendes: http://www.developerfusion.co.uk/show/4712/

fg
hannes

void 03.01.2007 14:28

hallo!

hast du mein beispiel ausprobiert?

danke für den link, aber bei mir funktioniert dabei leider nur der sichtbare bereich... vielleicht habe ich nicht ganz verstanden, wie man die gesamte webpage capturen kann...

Biri 03.01.2007 15:32

hi,

nein, ich hab dein beispiel nicht ausprobiert.

aber genau das von dir beschriebenen problem wird ja dort (link) auch beschrieben:
Zitat:

The code above copies the rendered image from the WebBrowser to the PictureBox. However, there is a problem. The problem is that the BitBlt operation will only copy the visible client area of the WebBrowser
..und danach wird gezeigt, was man tun muss, um den gesamten inhalt zu capturen. ich geb aber zu, ich habs nicht ausprobiert.

fg
hannes

void 03.01.2007 16:00

ja, habe ich gelesen, aber ändern tut sich bei der ausgabe nichts :D

also gut, man sollte sich halt doch zur offiziellen dokumentation bequemen: http://msdn2.microsoft.com/en-us/lib...wtobitmap.aspx
Zitat:

This method is not supported by this control.
... und http://groups.google.at/group/micros...a707004cf9d064
Zitat:

Es wurde auch schon öfter mal in anderen Foren bemerkt,
dass es es nicht (immer) funktioniert.
dann wird mir (oder meinem nachfolger :p) nichts anderes über bleiben, als das capturen durch eine andere methode durchzuführen...
(obwohl ich das ganze ja eh schon probiert habe :mad:, nur eben leider ohne erfolg)

void 03.01.2007 17:23

des rätsels lösung !!
 
also, jetzt funktionieren alle seiten wieder (natürlich nur jene, welche ich getestet habe...)!

warum?
ich habe javascript in den IE-settings deaktiviert!

und warum das?
alle nicht funktionierenden seiten hatten unter JavaScript den befehl .focus() für ein element verwendet... und aus irgendwelchen gründen, hat .DrawToBitmap() danach nicht mehr funktioniert...

die welt ist eine sammlung seltsamer bzw. unverständlicher phänomene :hallo:

Biri 03.01.2007 19:19

interessant!
ich hab inzwischen interessehalber die lösung mit dem kopieren des bildes über GDI32 implementiert. (wie im link angegeben) - hat aber einige probleme - Wenn Fenster < gewünschtes bild wird ein teil abgeschnitte und komischerweise funktioniert es bei ein paar seiten garnicht (z.b. microsoft.com).

vorschlag: poste deine lösung bei codeproject - anscheinend suchen ja mehrere leute danach und du kannst der comunity so einen guten diesenst erweisen. :cool:

fg
hannes


Alle Zeitangaben in WEZ +2. Es ist jetzt 23:53 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
© 2009 FSL Verlag