[ASP.NET] (embedded) webpage uit een Class Library openen

Pagina: 1
Acties:

  • MrSleeves
  • Registratie: Februari 2004
  • Laatst online: 10-04 19:23

MrSleeves

You'll thank me later.

Topicstarter
Zoals de titel al zegt: Ik wil een web page die als embedded resource in een class library staat openen.
Dit lukt allemaal prima met html-files, jpg's e.d. zonder problemen.
Daarvoor maak ik gebruik van de IHttpHandler-interface. Dat werkt prima.
In web.config "routeer" ik een bepaalde .aspx pagina naar de HttpHandler en deze handelt dan bepaalde requests af (in de sub ProcessRequest).

Het probleem is dat dit voor .aspx-files niet gaat werken. Deze moeten tenslotte eerste gerendered worden en dat gebeurt dus niet; wat op zich logisch is.

Voor de duidelijkheid:
in web.config staat:
code:
1
2
3
    <httpHandlers>
        <add verb="*" path="dllDevicesWeb.aspx" type="BE.DevicesWebHandler,DevicesWeb"/>
    </httpHandlers>


en vervolgens in de class DevicesWebHandler (die IHttpHandler implementeert):
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
   Public Sub ProcessRequest(ByVal context As System.Web.HttpContext) Implements System.Web.IHttpHandler.ProcessRequest
        If context.Request.Params.HasKeys = False Then
            Exit Sub
        End If

        Dim key As String = context.Request.Params.GetKey(0).ToLower
        Dim file As String = context.Request.Params.Item(key)

        'file is nu de file die we moeten hebben

        Select Case key
            Case "image"
                Me.SendImage(context, file)
            Case "html"
                Me.SendHtml(context, file)
            Case "aspx"
                Me.SendAspx(context, file)
            Case Else
                context.Response.Write("De key " + key + " wordt niet ondersteund in deze library.")
        End Select

    End Sub

Vervolgens kan de request uitgevoerd worden met context.Response.Outputstream en context.Response.ContentType.

De vraag is dus of ik dit systeem ook los kan laten op een webpage (al dan niet met een codebehind-file). Ik had het ContentType al gewijzigd in "text/aspx", maar dan wordt het bestand gewoon gedownload (en geopend in VS.NET). Ook geprobeerd om met HtmlTextWriter de Page handmatig (met RenderControl) te renderen en dan terug te sturen, maar dat leverde ook niets op.

Het idee is dat de webpage een pop-upscherm is die hoort bij een WebControl. Die WebControl staat in de Class Library en dus is het wel zo handig dat een pop-up-invulscherm dan ook daarin staat.

30Drie Web Design & IT Consultancy | Raven Consultancy Services


Verwijderd

Zie MSDN PageParser.GetCompiledPageInstance

  • MrSleeves
  • Registratie: Februari 2004
  • Laatst online: 10-04 19:23

MrSleeves

You'll thank me later.

Topicstarter
Ik heb er naar gezocht, maar het lukt me niet om dit werkend te krijgen:

code:
1
2
3
4
5
Public Shared Function GetCompiledPageInstance( _
   ByVal virtualPath As String, _
   ByVal inputFile As String, _
   ByVal context As HttpContext _
) As IHttpHandler


Het probleem is namelijk dat ik geen virtualPath heb en eigenlijk ook geen inputFile (hoewel ik die nog wel ergens vandaan moet kunnen halen). Eigenlijk heb ik alleen een stream van de assembly (class library). Het is tenslotte in de basis een embedded resource.

30Drie Web Design & IT Consultancy | Raven Consultancy Services


Verwijderd

MrSleeves schreef op woensdag 27 april 2005 @ 12:37:
Het probleem is namelijk dat ik geen virtualPath heb en eigenlijk ook geen inputFile (hoewel ik die nog wel ergens vandaan moet kunnen halen).
Is lang geleden dat ik het zelf gebruikt heb, maar ik meen te herinneren dat virPath vooral gebruikt wordt voor het terugvinden van al gecompileerde pagina's en dat het dus geen probleem is deze zelf te verzinnen zolang hij maar consistent is tussen calls. Als je de file dus kunt kopieren naar een temp dir ben je dan klaar.

Als je het me de voornoemde methode niet voor elkaar krijgt zul je echt in system.web.compilation moeten gaan wroeten. Omdat bijna niets daar public is heb je in principe 2 opties:

1) Via reflection de correcte methodes aanroepen om een pagina te compileren (hack)
2) De sources van Mono (www.go-mono.com) downloaden en aanpassen en deze gebruiken om het correcte type te compileren. Ik heb iets dergelijks weleens gedaan om een testimplementatie van de nieuwe masterpages feature in ASP.NET 2.0 te bouwen. Leuk en leerzaam, maar je haalt je wel een hoop ingewikkeld werk op je schouders en zo te zien heb je nog weinig ervaring met de ASP.NET processing pipeline (dat leid ik af uit je poging het content type van de pagina in text/aspx te veranderen) dus dat gaat je veel tijd kosten.

Ik kan alleen maar raden naar het doel van wat je al had (een makkelijkere installatie van een webbased applicatie of webcontrol?) maar ik wil je toch adviseren om een stap terug te doen, naar 'the big picture' te kijken en te overwegen of je doel al dat werk wel waard is en of er geen eenvoudiger oplossing is.

  • MrSleeves
  • Registratie: Februari 2004
  • Laatst online: 10-04 19:23

MrSleeves

You'll thank me later.

Topicstarter
Dat "text/aspx" was meer een kort-door-de-bocht-maar-het-zal-toch-wel-niet-werken poging, maar asp.net is inderdaad niet mijn core-business zeg maar.

Het enige waar het om gaat is dat ik in een WebControl in een Class Library heb en dat die WebControl een pop-up-schermpje nodig heeft. Het slaat dan natuurlijk nergens op om die dan in een andere library of in de asp.net-applicatie zelf te zetten. Jpg'jes en gifjes doen het prima.

Een andere optie is natuurlijk gewoon een html-pagina bouwen en die dan gebruiken.

In ieder geval, bedankt..

30Drie Web Design & IT Consultancy | Raven Consultancy Services