ASP.NET Zone

Die ASP.NET Community. Alle Antworten rund um Microsoft® Webtechnologien
Willkommen bei ASP.NET Zone. Anmelden | Registrieren | Hilfe | Impressum | ASP.NET Zone Suchplugin

in
Home Blogs Foren FAQ Communities Fotos Downloads
Werbeanzeige

Nach Response-Aufruf wird anschließend ausgeführter Code nicht im Browser dargestellt

Letzter Beitrag 06-11-2010, 12:36 von NoGoQuest. 5 Antworten.
Beiträge sortieren: Zurück Weiter
  •  05-31-2010, 9:33 217452

    Nach Response-Aufruf wird anschließend ausgeführter Code nicht im Browser dargestellt

    Hi Folks,

    ich habe ein UserControl auf dem ein ImageViewer (Atalasoft) eingebettet ist und in dem verschiedene Arten von Dokumenten angezeigt bzw. extern geöffnet werden sollen. Jetzt wird in einer Methode geprüft, um welche Formatendung es sich handelt. Wenn es sich um ein jpeg oder tif handelt werden die Dokumente im ImageViewer angezeigt. Handelt es sich jedoch um ein MS-Office- oder PDF-Dokument soll man die Möglichkeit bekommen es extern zu öffnen, desweiteren soll dabei ein ensprechendes Logo im Viewer angezeigt werden.
    Mein Problem besteht nun darin, das ich zwar die entsprechenden Dokumente mit Hilfe von Response-Aufrufen über ein Dialog öffnen kann, aber anschließend ausgeführter Code nicht zum Browser gesendet wird und nix passiert.

    Hier ein Codeauszug:
    Private Sub ShowDocument(ByVal documentID As Integer)
            Dim imageFile As String = ""
            Dim tempPath As String = ""
            Dim tempTifFile As String = ""
            Dim fileExtension As String = ""
            Dim contentType As String = ""
            currentSession = CType(Session("SessionState"), SessionState)
            imageFile = GetRealImageFilePath(documentID)
            fileExtension = GetFileExtension(imageFile)
            If fileExtension = ".doc" OrElse fileExtension = ".dot" OrElse fileExtension = ".xls" OrElse fileExtension = ".xla" OrElse fileExtension = ".pdf" Then
                    Select Case fileExtension
                        Case Is = ".doc"
                            contentType = "application/msword"
                        Case Is = ".dot"
                            contentType = "application/msword"
                        Case Is = ".xls"
                            contentType = "application/msexcel"
                        Case Is = ".xla"
                            contentType = "application/msexcel"
                        Case Is = ".pdf"
                            contentType = "application/pdf"
                    End Select
                  
                    Response.ClearContent()
                    Response.ClearHeaders()
                    Response.Buffer = True
                    Response.ContentType = contentType
                    Response.Clear()
                    Response.AddHeader("Content-Disposition", String.Format("attachment; filename={0}", currentSession.ActualDocument.DocumentID.ToString))
                    Response.WriteFile(imageFile)
                    Response.Flush()
                    Response.Close()
                    imageFile = currentSession.Directory + "\_images\_OfficeDokument.jpg"
                    tempTifFile = Server.MapPath("/Web") + "\_images\_tmp\1001.tif"
                    File.Copy(imageFile, tempTifFile, True)
                    ImageViewer.AutoZoom = AutoZoomMode.BestFit
                    ImageViewer.Open(tempTifFile)
                    File.Delete(tempTifFile)
           Else
                    tempTifFile = Server.MapPath("/Web") + "\_images\_tmp\1001.tif"
                    targetJPGFile = Server.MapPath("/Web") + "\_images\_tmp\1001.jpg"
                    File.Copy(imageFile, tempTifFile, True)
                    ImageViewer.AutoZoom = AutoZoomMode.BestFit
                    ImageViewer.Open(tempTifFile)
                    File.Delete(tempTifFile)
           End If
    End Sub


    Wenn ich jetzt den Teil mit den Response-Aufrufen auskommentiere, wird z.B. das _OfficeDokument.jpg ordentlich im ImageViewer angezeigt und auch anderer Code, wie Statuszeile wird ordentlich im Browser dargestellt.
    Was mache ich falsch? Ich hoffe jemand von euch kann mir weiterhelfen.

    Gruß NoGo

  •  06-01-2010, 16:14 217463 Antwort zu 217452

    AW: Nach Response-Aufruf wird anschließend ausgeführter Code nicht im Browser dargestellt

    Hey Board,

    werd ich hier gerade wieder übersehen oder gibt es wirklich keine Lösungsansätze für mein Problem???
    Wäre echt schade, weil mich das mit den Response-Aufrufen echt verrückt macht und es doch nicht sein kann,
    das danach die ganze Seite nicht mehr ordentlich funktioniert.

    Bitte helft mir oder irgendein Lebenszeichen!
    Wäre echt was feines...

    Gruß NoGo
  •  06-01-2010, 17:41 217465 Antwort zu 217452

    AW: Nach Response-Aufruf wird anschließend ausgeführter Code nicht im Browser dargestellt

    Hi,
    NoGoQuest:

    ich habe ein UserControl auf dem ein ImageViewer (Atalasoft) eingebettet ist und in dem verschiedene Arten von Dokumenten angezeigt bzw. extern geöffnet werden sollen.

    Das ImageViewer Dingens ist was clientseitiges?

    NoGoQuest:

    Mein Problem besteht nun darin, das ich zwar die entsprechenden Dokumente mit Hilfe von Response-Aufrufen über ein Dialog öffnen kann, aber anschließend ausgeführter Code nicht zum Browser gesendet wird und nix passiert.

    Ich weiß ehrlich gesagt nicht, was Du meinst. Warum sollte ausgeführter Code zum Browser gesendet werden?

    NoGoQuest:

    Response.Clear()
    Response.AddHeader("Content-Disposition", String.Format("attachment;
    filename={0}"
    , currentSession.ActualDocument.DocumentID.ToString))
    Response.WriteFile(imageFile)
    Response.Flush()
    Response.Close()


    Danach wird nichts mehr gesendet, weil die Rückgabe abgeschlossen ist.

    Was sollte denn deiner Meinung nach passieren?

    NoGoQuest:

    If fileExtension = ".doc" OrElse fileExtension = ".dot" OrElse fileExtension = ".xls" OrElse fileExtension = ".xla" OrElse fileExtension = ".pdf" Then
        Select Case fileExtension
            Case Is = ".doc"
                contentType = "application/msword"
            Case Is = ".dot"
                contentType = "application/msword"
            Case Is = ".xls"
                contentType = "application/msexcel"
            Case Is = ".xla"
                contentType = "application/msexcel"
            Case Is = ".pdf"
                contentType = "application/pdf"
        End Select
    End if


    Das kann man auch einfacher schreiben.

    Select
    Case fileExtension
        Case ".doc", ".dot"
            contentType = "application/msword"
        Case ".xls", ".xla"
            contentType = "application/msexcel"
        Case ".pdf"
           
    contentType = "application/pdf"
    End Select


    NoGoQuest:

    Wenn ich jetzt den Teil mit den Response-Aufrufen auskommentiere, wird z.B. das _OfficeDokument.jpg ordentlich im ImageViewer angezeigt und auch anderer Code, wie Statuszeile wird ordentlich im Browser dargestellt.
    Was mache ich falsch?

    Ich denke mal, Du hast die Basics bei Webanwendungen noch nicht verinnerlicht.

    Daher ein paar Vorschläge:

    a) Lagere deinen Code fürs senden der Datei an den Client in einen Handler aus. Ich nehme an, derzeit steht der in einer Webform bzw. einem Control, oder?
    b) Versuch nicht, zwei verschiedene Dateiarten in einem Skript an den Client zu senden. Die Webform bzw. das Webcontrol gibt HTML aus, dynamische Bilder und Dokumente gibt man über einen Handler aus, nicht über eine Webform.
    c) Das ImageViewer Dingens kenn ich nicht, daher kann ich dazu wenig sagen. Es gilt aber auch hier: Du kannst nicht HTML und Dokument/Bild in einem Rutsch zurückgeben (zumindest noch nicht).


    --
    Gruß, Stefan Falz
    Microsoft MVP - Visual Developer ASP/ASP.NET
    ASP.NET Consulting, Development, Coaching

    ASP.NET Zone - Leitfaden für gute Postings

    Xtopia 2008 - Gewinnspiel / Expression Studio und Xtopia Eintrittskarten zu gewinnen
  •  06-02-2010, 14:32 217479 Antwort zu 217465

    AW: Nach Response-Aufruf wird anschließend ausgeführter Code nicht im Browser dargestellt

    Hallo Stefan,

    ich versuche mal ein wenig auf deine Antwort einzugehen, um der Sache mit den Handler (ist neu für mich) auf den Grund zu gehen und dir die Möglichkeit zu geben, um mein Problem besser zu verstehen.
    Stefan Falz:

    Das ImageViewer Dingens ist was clientseitiges?

    <%@ Control Language="VB" AutoEventWireup="false" CodeFile="ImageControl.ascx.vb" Inherits="_Pages_Viewer_Controls_ImageControl" %>
    <%@ Register Assembly="Atalasoft.dotImage.WebControls" Namespace="Atalasoft.Imaging.WebControls" TagPrefix="cc1" %>
    </cc1:WebImageViewer id="ImageViewer" runat="server" height="800px" width="100%">

    Wie du am Code erkennen müsstest, ist der ImageViewer nicht clientseitig.
    Stefan Falz:

    Ich weiß ehrlich gesagt nicht, was Du meinst. Warum sollte ausgeführter Code zum Browser gesendet werden?

    Vielleicht hab ich mich da unglücklich ausgedrückt. Mir ging es ja darum, dass nach den Response-Aufrufen noch Code steht, der ja auch ausgeführt wird (zu sehen beim debuggen) und auch andere Webcontrols auf der Seite verarbeitet werden, es nun aber zu keinem Postback kommt und die Seite nicht aktualisiert wird.
    Stefan Falz:

    Was sollte denn deiner Meinung nach passieren?

    Nach einem Klick auf einen 'Anzeigen'-Button sucht er sich das erste Dokument aus einer bestimmten Anzahl von Suchtreffern raus und übergibt die ID an die Methode 'ShowDocument' von oben. Was die macht bzw. machen soll, siehst du ja oben. Mein gewünschtes Verhalten soll jetzt einfach nur sein, das die Titelzeile der Seite mit dynamischen Text angepasst wird (also sowas in der Art von 'Suchtreffer 1 von 20'), ein bestimmtes Logo in meinem ImageViewer angezeigt wird und ein 'Speichern unter'-Dialog für mein entsprechendes Dokument (.doc, .xls, .pdf) erscheint.
    Stefan Falz:

    a) Lagere deinen Code fürs senden der Datei an den Client in einen Handler aus. Ich nehme an, derzeit steht der in einer Webform bzw. einem Control, oder?

    Ich habe mich jetzt schon mal ein wenig in die Sache mit den HTTPHandler eingelesen. Also ich glaube das mit dem Anlegen eines solchen Handler sollte kein Problem darstellen. Wo ich jetzt noch auf dem Schlauch stehe, ist, wie ich den in mein UserControl implementiere bzw. wo ich den Aufrufe, auch so, dass ich dem Handler Werte mit übergeben kann, wie das ImageFile oder den ContentType? Vielleicht hast du da ein paar Tips oder auch weiterführende Links, die mir Helfen könnten, das mit den Handlern besser zu verstehen.

    Gruß und Dank NoGo

  •  06-09-2010, 14:58 217603 Antwort zu 217479

    AW: Nach Response-Aufruf wird anschließend ausgeführter Code nicht im Browser dargestellt

    Sorry,

    ich finde einfach keine Möglichkeit, wie ich den Handler in der Methode des UserControls aufrufen kann.

    Mag sein, dass ich grad ein Brett vorm Kopf hab, deshalb würde es mir weiterhelfen, wenn irgendjemand einen Tip hätte,
    wie man sowas realisieren kann.

    Gruß NoGo
  •  06-11-2010, 12:36 217619 Antwort zu 217603

    AW: Nach Response-Aufruf wird anschließend ausgeführter Code nicht im Browser dargestellt

    Hallo Leute,

    ich habe jetzt das Problem mit dem HttpHandler teilweise gelöst.
    Mein Problem war es ja, dass ich nicht genau wusste wo und wie ich den Handler aufrufen sollte.

    Ich habe es jetzt so realisiert, dass ich auf der Inhaltsseite meiner Masterpage ein RegisterStartupScript in einer Methode ausführe, wenn die Bedingung erfüllt ist, dass es sich um ein PDF- oder Office-Dokument handelt.

    Das ganze sieht dann so aus:
    ClientScript.RegisterStartupScript(Me.GetType(), "Download", "<script src=/_images/_tmp/" + tempFile + "></script>")
    Meinen Handler habe ich so realisiert, das ich eine Klasse im Ordner App_Code erstellt habe, die die Klasse IHttpHandler implementiert.

    Diese sieht folgendermaßen aus:
    Imports System.IO
    Imports System.Web
    Public Class DownloadHandler
        Implements IHttpHandler
        Public Sub ProcessRequest(ByVal context As System.Web.HttpContext) Implements System.Web.IHttpHandler.ProcessRequest
            Dim request As HttpRequest = context.Request
            Dim response As HttpResponse = context.Response
            Dim FilePath As String = request.PhysicalPath
            response.ClearContent()
            response.ClearHeaders()
            'response.Clear()
            If Not String.IsNullOrEmpty(FilePath) Then
                Dim fi As FileInfo = New FileInfo(FilePath)
                If fi.Exists Then
                    Dim fiExtension As String = fi.Extension.LastIndexOf(".") + 1
                    'response.ContentType = String.Format("application/{0}", fiExtension)
                    response.ContentType = "application/octetstream"
                    response.AddHeader("Content-Disposition", String.Format("attachment; filename={0}", fi.Name))
                    response.WriteFile(fi.ToString)
                    'response.Close()
                End If
            End If
            'response.End()
        End Sub
        Public ReadOnly Property IsReusable() As Boolean Implements System.Web.IHttpHandler.IsReusable
            Get
                Return False
            End Get
        End Property
    End Class

    In der web.config ist das ganze dann so registriert:
    <httpHandlers>
          <add verb="GET" path="*.doc" type="DownloadHandler"/>
          <add verb="GET" path="*.xls" type="DownloadHandler"/>
          <add verb="GET" path="*.pdf" type="DownloadHandler"/>
    </httpHandlers>


    Wenn ich jetzt meine Anwendung ausführe und ein PDF- oder Office-Dokument anfordere, wird der Handler korrekt aufgerufen, so wie ich mir das vorgestellt habe. Jetzt habe ich aber das umgekehrte Problem, wie ich es am Anfang hatte (im ersten Beitrag beschrieben), nämlich, dass meine Anforderungen korrekt in der Seite verarbeitet werden, jedoch der Öffnen-Dialog nicht erscheint bzw. es zu Fehlern kommt.

    Bei PDF-Dokumenten kommt es zu einem Syntaxfehler (%PDF-1.3\n) und bei Office-Dokumenten werden ungültige Zeichen dargestellt, wenn oben aufgeführter Code im Handler ausgeführt wird. Wenn ich jedoch die auskommentierten Zeilen mit reinnehme, passiert gar nix.

    Ich denke Peter, hat dieses Problem in seinem Artikel http://www.aspnetzone.de/blogs/peterbucher/archive/2007/11/20/daten-mit-asp-net-zum-client-schicken-oder-wieso-eigentlich-httphandler.aspx unter "Wieso sollte eine Datei oder ein Bild nicht per ASPX Seite versendet werden? " schon beschrieben. Leider helfen mir aber dort beschriebene Lösungsvorschläge nicht weiter.

    Wo könnte der Fehler bei mir liegen? Über weitere Lösungsvorschläge wäre ich wirklich dankbar.

    Gruß NoGo
Als RSS Feed in XML ansehen
Powered by Community Server (Commercial Edition)