Avatar billede donpedrodelavega Nybegynder
04. oktober 2003 - 23:15 Der er 26 kommentarer og
1 løsning

Bedste maade at lave en FrontController

Som jeg kan se det er der tre indlysende (og dybt forskellige) fremgangsmaader at implementere et FrontController pattern i ASP.NET - da jeg ikke foer har implementeret en saadan mangler jeg selvf. erfaringen til at vaelge en fremgangsmade.

Jeg vil derfor hoere om der er nogle der har gjort sig nogle erfaringer med dette ??

De tre som jeg umiddelbart kan se:
- GlobalAsax.Application_BeginRequest
- IHttpModule.Init
- IhttpHandler.ProcessRequest

/ DonPedro
Avatar billede nielslbeck Nybegynder
05. oktober 2003 - 01:10 #1
Jeg startede med at benytte Global.Application_BeginRequest, men fik desværre en del problemer ud af det :-( Blandt andet virkede sessions ikke mere, hvilket ikke kan siges at være optimalt.

Har ikke prøvet med IHttpModule.Init, men benytter nu IHttpHandler.ProcessRequest, hvilket må siges at virke perfekt. Jeg har endnu ikke oplevet nogen problemer, ved at benytte den metode - så den kan klart anbefales :-)
Avatar billede donpedrodelavega Nybegynder
05. oktober 2003 - 10:56 #2
det maa siges at vaere et godt argument for at gaa uden om at bruge Global.Begin_Request, da man ellers selv skal til at lave sin tilstandshaandtering... og det har jeg proevet een gang uden saerlig meget held - det endte faktisk med en workaround :)

Mht. at bruge HttpHandler har jeg nogle problemer som i foerste omgang foerte mig til at kigge paa HttpModule loesningen.

Jeg har vanskeligheder ved at faa min handler implementering til at modtage samtlige requests for .aspx resourcer.
Det jeg indtil nu har vaeret noedt til er at have en default.aspx liggende i samtlige dirs under rootdir og saa saette min web.config til at sende samtlige requests for disse default.aspx til min handler, og det maa siges at vaere meget lidt holdbart... jeg oensker at undlade at lave direkte links og istedet linke til ressourcer defineret udelukkende gennem directory url'er.

/ DonPedro
Avatar billede nielslbeck Nybegynder
05. oktober 2003 - 11:06 #3
Det bliver nok lidt svært at løse, uden at skulle sætte IIS'en op på en lidt speciel måde. Jeg ville gerne lave det samme, og endda sådan at bibliotekerne ikke behøvede at være fysiske - dvs at de ikke behøvede at eksistere, da jeg havde alt i databasen. Det jeg så gjorde var som beskrevet ovenfor, og så satte jeg i mappings i IIS'en den til at * skulle håndteres af C:\WINDOWS\Microsoft.NET\Framework\v1.1.4322\aspnet_isapi.dll - dvs af ASP.NET. På den måde har jeg fuldstændig kontrol over hvad der vises ved forskellige URL'er :-)
Avatar billede donpedrodelavega Nybegynder
05. oktober 2003 - 11:32 #4
dvs. din handler ogsaa skulle haandtere gif, jpg, html u.s.w. ?

/ DonPedro
Avatar billede nielslbeck Nybegynder
05. oktober 2003 - 11:42 #5
Yeps - tjekker på efternavnet af den forespurgte fil, og hvis det ikke er noget jeg har lyst til at håndtere, kigger jeg bare efter filen på disken, og hvis den findes sender jeg den bare afsted - det er faktisk ret blæret :-)
Avatar billede donpedrodelavega Nybegynder
05. oktober 2003 - 11:47 #6
det maa vaere maaden at goere det paa... :)
Men - hvis det saa er en forespoergsel paa en resource som din app. ikke skal haandtere, og du saa efterfoelgende leder og finder det paa disk - hvilken fremgangsmaade bruger du saa til at sende den til response objektet ?

/ DonPedro

note... jeg synes det er lidt en skam man ikke kan saette det op i web.config, men at man skal igennem IIS'en... :)
Avatar billede donpedrodelavega Nybegynder
05. oktober 2003 - 11:50 #7
btw... du er allerede gaaet udover spoergsmaalets egt. ordlyd saa hvis du er interesseret i lige at hjaelpe med de sidste detaljer saa smider jeg gerne flere points i puljen (hvis det goer nogen egt. forskel) ?

/ DonPedro
Avatar billede nielslbeck Nybegynder
05. oktober 2003 - 11:50 #8
Jeg sender filen som en application/octet-stream:

context.Response.ContentType = "application/octet-stream";
context.Response.WriteFile(realPath);

Men ja, trist det ikke kan gøres udenom IIS'en :-(
Avatar billede donpedrodelavega Nybegynder
05. oktober 2003 - 11:51 #9
selvf - elegant... :D

/ DonPedro
Avatar billede nielslbeck Nybegynder
05. oktober 2003 - 11:51 #10
Skulle jeg da nok kunne klare :-)
Avatar billede nielslbeck Nybegynder
05. oktober 2003 - 11:52 #11
Synes selv det er ret smart!
Avatar billede nielslbeck Nybegynder
05. oktober 2003 - 11:53 #12
Har bare lige besøg af en kammerat - skal lige lave nogle afleveringer... men senere på dagen skulle jeg være helt klar :-)
Avatar billede nielslbeck Nybegynder
05. oktober 2003 - 17:10 #13
Så er jeg klar - hvis der var nogen spørgsmål :-)
Avatar billede donpedrodelavega Nybegynder
06. oktober 2003 - 20:48 #14
nu synes jeg har jeg forsoegt alt. Jeg kan simpelthen bare ikke faa IIS'en til at haandtere requests direkte alene paa dir's.

/ DP
Avatar billede donpedrodelavega Nybegynder
06. oktober 2003 - 21:10 #15
nu har jeg gjort foelgende i IIS'en:

- Properties >> Directory >> Configuration >> App mappings : jeg har tilfoejet en enkelt mapping med extension .* som peger på isapi_dll under frameworket. Alle andre mappings har jeg fjernet.

- Properties >> Documents >> Enable default document : Disablet

- web.config:
    <httpHandlers>
      <add verb="*" path="*" type="FrontController.Handler, FrontController" />
    </httpHandlers>

- min handler haandterer requests ved at hente en commmand fra min commandfactory og bruge denne til at lave en server.transfer på den url den specifikke cmd mappes til fra mit URL-map.

/ DP
Avatar billede donpedrodelavega Nybegynder
07. oktober 2003 - 09:13 #16
jeg haaber du ikke har helt har mistet taalmodigheden ?? :)

/ DP
Avatar billede donpedrodelavega Nybegynder
07. oktober 2003 - 10:16 #17
uanset hvad jeg foretager mig saa ender jeg med..
"Error executing child request for Alpha.aspx."

Jeg har implementeret den her:
http://msdn.microsoft.com/architecture/patterns/ImpFrontControllerInASP/
men kan ikke faad et til at virke... :(

/ DP
Avatar billede donpedrodelavega Nybegynder
07. oktober 2003 - 10:29 #18
isapi_dll kan ikke haandtere child requests... dvs. at jeg fra min handler ikke kan kalde server.transfer da et server.transfer kald gaar gnm. IIS'en og videre derigennem til isapi_dll der er designet til at ikke at haandtere childprocessor af en eksisterende process (hvis jeg har forstaaet det korrekt).

skal man goere noget specifikt for at sikre threadsafety eller hvad ??

/ DP
Avatar billede donpedrodelavega Nybegynder
07. oktober 2003 - 10:54 #19
hmmm... den her traad lover jo altsaa ikke godt... og det er noget af det mest konkrete jeg har kunne finde...
http://www.gotdotnet.com/community/messageboard/Thread.aspx?id=97644

/ DP
Avatar billede nielslbeck Nybegynder
07. oktober 2003 - 10:56 #20
Er desvaerre ikke lige i naerheden af en Windows PC lige nu - og slet ikke min egen, saa jeg har lidt svaert ved at hjaelpe dig :-(

Kender ikke lige det eksempel du linker til, men det kunne jo vaere det ville vaere en god ide hvis jeg lige kiggede paa det engang - har trods alt ikke laest noget teori om emnet, og hvordan det er den bedste maade at skrue det sammen paa. Maa lige se om jeg faar tid engang...

Jeg bruger ikke Server.Transfer, da jeg enten henter mine sider fra en database, eller sender dem via en octet-stream.
Avatar billede donpedrodelavega Nybegynder
07. oktober 2003 - 11:03 #21
det forklarer jo saa lidt af det hele... jeg troede at du brugte server.transfer / server.execute...

det her er det mest konkrete resultat en soegning paa MS's knowledge database giver...
http://support.microsoft.com/default.aspx?scid=kb;en-us;320439

/ DP
Avatar billede nielslbeck Nybegynder
07. oktober 2003 - 19:52 #22
Har lige skimmet ned over Microsofts implementation af FrontController. Så vidt jeg kan se er det overhovedet ikke meningen man skal bruge hverken Transfer eller Execute - som jeg brugte i min (ikke fungerende) implementation hvor jeg benyttede BeginRequest.

UrlMap.cs sørger jo for, at du kan vise de sider du vil (husk at indsætte dem i web.config).

Så hvad er det du vil bruge de to funktioner til?
Avatar billede donpedrodelavega Nybegynder
08. oktober 2003 - 09:44 #23
MS's implementation bruger server.transfer i classen RedirectingCommand og det er dette kald der er aarsag til hele misaeren... siden skal jo ogsaa sendes igennem hele applicationen workflow for at virke korrekt.

/ DP
Avatar billede nielslbeck Nybegynder
08. oktober 2003 - 09:47 #24
Ups... det gør den jo også. Meget mystisk at Microsoft selv kan få det til at virke - hvis de da ellers har testet deres kode ;-)

Tror desværre ikke jeg kan hjælpe meget mere så :-(
Avatar billede donpedrodelavega Nybegynder
08. oktober 2003 - 09:52 #25
jeg har koebt denne (umiddelbart) enestaaende bog for den beskedne sum af 719,00 DKK (http://www.amazon.co.uk/exec/obidos/ASIN/0735615829/ref=br_lf_b_8/202-7063366-5991844) og holder den bare halvdelen af hvad den lover byder den paa et hav af metoder til loesning af denne konkrete udfordring.

/ DP
Avatar billede donpedrodelavega Nybegynder
22. december 2003 - 09:52 #26
virker ikke... gad vide om der er et problem med ASP.NET's maade at afvikle en Server.Transfer / Execute ??

/ DP
Avatar billede nielslbeck Nybegynder
09. maj 2004 - 15:42 #27
Hmm... nu sidder jeg så selv og skal lave en side hvor ikke alt kommer fra databasen eller ligger som filer der blot skal sendes afsted - jeg har med andre ord en stak .aspx-filer som jeg gerne vil ha' udført...

Fandt du en løsning på problemet? Du skal nok få en stak points hvis du har en løsning :-)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester