Implementazione ASP.NET su server Windows senza IIS

Aperto da Flavio93Zena, Mercoledì - 18 Maggio 2022 - 23:22

0 Utenti e 2 Visitatori stanno visualizzando questa discussione.

Flavio93Zena

Ciao a tutti, mi sono trovato a dover fare una cosa completamente sconosciuta per me - implementare un sito con web services in c sharp e pagine in .aspx su un server Windows 2008 R2 (sì, lo so, vabbè) ma con la grossa limitazione di non poter utilizzare IIS, il sistema built-in di Windows per poter ospitare web services. La soluzione è mod_aspdotnet, al momento fornita su GitHub, che ha 3 files all'interno - Apache.Web.dll, mod_aspdotnet.so e resolve_apache.dll.

  • Primo passo, scarichiamo ed installiamo XAMPP, avendo cura di selezionare l'opzione "Apache", le altre non ci interessano (a meno di avere altre esigenze). Preferibilmente installiamolo in C:\xampp
  • Probabilmente avremo bisogno di alcune dependencies di .NET framework, a seconda dell'applicazione in ASP che avete. Per cui scarichiamolo, la versione corrente al tempo di questo post è la 4.8 - NET Framework
  • A meno che non vogliate installare l'intero pacchetto di Visual Studio solo per utilizzare la funzione gacutil ci servirà PowerShell. Se lavorate per un cliente e dovete installare questa solution sul loro server dubito che saranno contenti di installare tutto Visual Studio (può arrivare a pesare decine di GB), per cui questo è un workaround.
    PowerShell
  • Apriamo PowerShell come amministratori e lanciamo questo script:
    #Note that you should be running PowerShell as an Administrator
    Set-location "C:\path\alla\vostra\cartella\di\mod_aspdotnet"
    [System.Reflection.Assembly]::Load("System.EnterpriseServices, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a")
    $publish = New-Object System.EnterpriseServices.Internal.Publish
    $publish.GacInstall("C:\path\alla\vostra\dll\di\mod_aspdotnet\Apache.Web.dll")

    #If installing into the GAC on a server hosting web applications in IIS, you need to restart IIS for
    #the applications to pick up the change.
    #Uncomment the next line if necessary...
    #iisreset
    Avendo cura di correggere i percorsi adeguatamente puntando al file Apache.Web.dll che avevamo scaricato all'inizio da GitHub per aspdotnet. (Sì, SOLO ad Apache.Web.dll)
    Questo script aggiungerà la DLL alla GAC (Global Assembly Cache) del vostro .NET framework che abbiamo installato nel secondo passaggio.
    Attenzione, lo script non ritorna alcun tipo di feedback, eseguitelo una volta facendo attenzione ai percorsi.
  • Controlliamo che il file C:\Windows\Microsoft.NET\assembly\GAC_64\Apache.Web\vX (X sta per numeri a seconda della versione)\Apache.Web.dll esista.
  • Copiamo e incolliamo il file mod_aspdotnet.so nella directory C:\xampp\Apache\modules
  • Copiamo la cartella con la nostra applicazione in ASP.net dentro la cartella C:/xampp/htdocs/nostra_cartella_applicazione
  • Aggiungiamo questo codice:
    ##### ASP.NET CONFIGURATION #####
    LoadModule aspdotnet_module "modules/mod_aspdotnet.so"
    AddHandler asp.net asax ascx ashx asmx aspx axd config cs csproj licx rem resources resx soap vb vbproj vsdisco webinfo
    <IfModule mod_aspdotnet.cpp>
    # Mount the ASP.NET /asp application
    AspNetMount /nostra_cartella_applicazione "C:/xampp/htdocs/nostra_cartella_applicazione"
    #/SampleASP is the alias name for asp.net to execute
    #"c:/SampleASP" is the actual execution of files/folders in that location

    # Map all requests for /asp to the application files
    Alias /nostra_cartella_applicazione "C:/xampp/htdocs/nostra_cartella_applicazione"
    #maps /SampleASP request to "c:/SampleASP"
    #now to get to the /SampleASP type http://localhost/SampleASP
    #It'll redirect http://localhost/SampleASP to "c:/SampleASP"

    # Allow asp.net scripts to be executed in the /SampleASP example
    <Directory "C:/xampp/htdocs/nostra_cartella_applicazione">
    #Change the directory to the location of your ASP.NET mount point (the location must be same as "AspNetMount" directive location)
    Options FollowSymlinks ExecCGI
    Order allow,deny
    Allow from all
    DirectoryIndex Default.aspx
    #default the index page to .htm and .aspx
    </Directory>

    # For all virtual ASP.NET webs, we need the aspnet_client files
    # to serve the client-side helper scripts.
    AliasMatch /aspnet_client/system_web/(\d+)_(\d+)_(\d+)_(\d+)/(.*) "C:/Windows/Microsoft.NET/Framework/v$1.$2.$3/ASP.NETClientFiles/$4"
    <Directory "C:/Windows/Microsoft.NET/Framework/v*/ASP.NETClientFiles">
    Options FollowSymlinks
    Order allow,deny
    Allow from all
    </Directory>
    </IfModule>
    in fondo al file C:/xampp/apache/conf/httpd.conf e salviamolo.
  • Modifichiamo adeguatamente il file con le configurazioni asp.net (4 posti: AspNetMount, Alias /, <Directory, DirectoryIndex). I primi 3 sono per far funzionare il tutto, il quarto dovrebbe essere l'indice della vostra applicazione ASP.net, nel mio caso si trattava di Default.aspx invece di Index.aspx!
  • Riavviamo Apache da dentro XAMPP e mappiamo la porta desiderata (80, 8080, quella che volete).
  • Incrociamo le dita e testiamo! 8) :D

Alla prossima follia! :D

aslupin3

Scusami ma non riesco a capire il senso di una operazione del genere.
ASP.Net (.aspx) con qualunque linguaggio realizzato (VB, C#, ecc.), è e rimane un componente .Net e come tale il riferimento è proprio IIS, Web Server naturale su server Windows, che per inciso nelle ultime versioni on è affatto male - o come pensa qualcuno IL male.
Il comportamento ottimale di pagine .aspx si ha proprio con IIS.
L'uso di strumenti esterni non solo non garantisce migliori performance (credo anzi proprio il contrario), ma secondo me mina anche la sicurezza del sistema.

Darknico

#2
La penso come te @aslupin3 (sono un programmatore .net), ed infatti ho già insultato @Flavio93Zena privatamente  >:D
Da quanto mi ha detto, non è stata una sua scelta...
Non supporto privatamente, non risponderei e ci rimarreste male....

Flavio93Zena

Restrizioni aziendali, per non dover aver a che fare con gli aggiornamenti di IIS e relativa configurazione. Aggiornare XAMPP una volte ogni secolo è molto più semplice e non richiede riconfigurare nulla.

Riguardo alla sicurezza dovrebbe essere identica, per la velocità essendo che deve "rimbalzare" su Apache e mod_aspdotnet è certamente leggermente più lento.

Nel mio caso specifico è stato fatto per macchinari industriali destinati ad intranet aziendali, per cui la sicurezza non è stata nemmeno considerata ma non dovrebbe essere un problema a meno che non si usino funzioni OWin, perchè non funzionano essendo basate su IIS.

aslupin3

#4
Scusami ancora ma la pezza è ancora peggio del buco.

Citazioneper non aver a che fare con gli aggiornamenti di IIS e relativa configurazione. Aggiornare XAMPP una volta ogni secolo ...

Ma scherzi vero?
Guarda che anche XAMPP ha aggiornamenti periodici anche abbastanza ravvicinati. Se non lo aggiorni sono scelte, ma di certo NON le più sensate e corrette.

Se poi rimaniamo nelle scelte, si può NON aggiornare anche IIS, funziona lo stesso, eh.

Discorso configurazione. Anche Apache con relativi moduli va configurato e la configurazione non è proprio "un paio di click".
Anche qui, se unzippi XAMPP e ti tieni la configurazione "standard" è una scelta. La più comoda? Probabile. La migliore? Molto probabilmente no.

E poi una volta configurato il webserver, sia esso Apache sia IIS, le necessità di ritoccare nel breve sono praticamente nulle.

Per cui, sono scelte, si. Ma non le capisco e non mi convincono.

Non volermene, capisco che la decisione non dipende da te.
Considerazioni sulla scelta ;)


Flavio93Zena

Apache l'ho letteralmente preso e buttato lì :D Il problema di non aggiornare IIS è che viene con Windows, il che significa poter potenzialmente non aggiornare per molti anni e avere problemi a far girare la roba con sistemi futuri - c'è gente, anche nel reparto sanità, che gira su Windows XP e ci sono ancora parecchi server su Windows 2003 Server. In questo modo il problema non dovrebbe sussistere...

Come dicevo per l'azienda che lo ha voluto va benissimo in questo modo :)