2010-05-27 23 views
18

Sto cercando di scrivere un piccolo servizio Web per l'esecuzione su una piccola scatola Linux. Preferisco codificare in C#, quindi sto cercando di usare Mono.HttpListener funziona bene su Mono?

Non voglio il sovraccarico di eseguire un server web completo o la versione di Mono di ASP.NET. Sto pensando di avere un singolo processo con un thread che si occupa di ogni connessione client. Memoria condivisa tra thread invece di un database.

Ho letto un po 'sulla versione Microsoft di HttpListener e su come funziona con il driver Http.sys. Purtroppo, la documentazione di Mono su questa classe è solo l'interfaccia di classe automatizzata senza alcuna discussione su come funziona sotto il cofano. (Linux non ha Http.sys, quindi immagino sia implementato in modo sostanzialmente diverso.)

Qualcuno potrebbe indicarmi alcune risorse per discutere di questo modulo?

Molte grazie, Bill, billpg.com

(Un po 'di storia alla mia domanda per gli interessati.)

Qualche tempo fa, ho chiesto this question, interessati a mantenere una lunga conversazione aperta con un sacco di avanti e indietro. Mi ero deciso a progettare il mio protocollo ad hoc, ma le persone con cui ho parlato desideravano davvero un'interfaccia REST, anche a costo del segnale "Okay, invia il tuo comando adesso".

Quindi, mi sono chiesto di eseguire ASP.NET su un server Linux/Mono, ma sono incappato su HttpListener. Sembrava l'ideale, dato che ogni "conversazione" poteva essere eseguita in un thread separato. Il thread che chiama HttpListener in un ciclo può cercare per quale thread è presente ogni connessione incomming e passare il riferimento a quel thread.

L'alternativa per un servizio basato su ASP.NET, consiste nel fare in modo che il codice ASPX prelevi lo stato da un database e scriverne il nuovo stato al termine. Sì, funzionerebbe, ma è un sacco di spese generali.

+0

mi piacerebbe iniziare qui: http://www.koders.com/csharp/fidD8A53577DCD929265B6FE7D3B483FE38655DFDCF.aspx –

+0

@MauricioScheffer - Il tuo link non sembra funzionare più. –

risposta

24

Saluti, La classe HttpListener in Mono funziona senza grossi problemi. Penso che la differenza più significativa tra il suo utilizzo in un ambiente MS e in un ambiente Linux sia che la porta 80 non può essere associata senza una protezione root/su/sudo. Altre porte non hanno questa restrizione. Ad esempio se si specifica il prefisso: http://localhost:1234/ HttpListener funziona come previsto. Tuttavia, se aggiungi il prefisso http://localhost/, che ti aspetteresti di ascoltare sulla porta 80, fallisce silenziosamente. Se si tenta esplicitamente di eseguire il binding sulla porta 80 (http://localhost:80/), si genera un'eccezione.Se si richiama la propria applicazione come super utente o root, è possibile eseguire esplicitamente il binding sulla porta 80 (http://localhost:80/).
Non ho ancora esplorato il resto dei membri di HttpListener in modo sufficientemente dettagliato da fornire commenti utili su come funziona correttamente in un ambiente Linux. Tuttavia, se c'è interesse, continuerò a postare le mie osservazioni.

chickenSandwich

+6

Puoi 'sudo setcap 'cap_net_bind_service = + ep'/usr/local/bin/mono-sgen' per abilitare le porte <1024 senza diritti di superutente. Assicurati di controllare se il percorso 'mono-sgen' è corretto per te prima di eseguire il comando. –

+0

Ha funzionato bene per me fino a oggi:/ora ottengo connessioni che persistono nello stato di fin_wait2 ma probabilmente non è correlato all'upgrade mono –

2

Non sono sicuro del motivo per cui vuoi guardare così in profondità nel cappuccio. Anche su Microsoft, i documenti su http.sys potrebbero non fornire informazioni davvero preziose se si utilizza .NET Framework.

Per sapere se qualcosa funziona su Mono abbastanza bene, si dovrebbe sempre scaricare la sua immagine VMware o VPC e testare le applicazioni su di esso.

http://www.go-mono.com/mono-downloads/download.html

Anche se Mono è molto più maturo rispetto a qualche anno fa, non si può dire che è stato testato da numero sufficiente di applicazioni reali come Microsoft.NET. Quindi, prova le tue applicazioni e invia i problemi che trovi al team Mono.

In base alla mia esperienza, i problemi minori vengono risolti entro pochi giorni, mentre per i problemi principali ci vuole più tempo. Ma con il codice sorgente Mono disponibile, puoi risolvere da solo o trovare soluzioni alternative il più delle volte.

+0

Molte grazie Lex. Mi aspettavo che la versione di Microsoft della libreria aprisse un socket-listen ed eseguisse l'analisi dell'intestazione. Non mi aspettavo un modulo del kernel in esecuzione nell'anello 0. Se la versione di Mono utilizza anche un modulo del kernel, informerà tutte le decisioni di ingegneria che devo prendere. – billpg

+0

Http.sys appare per la prima volta in Windows Server 2003 per migliorare le prestazioni e fornire nuove funzionalità. Ma non cambia HttpListener API, giusto? HttpListener funziona ancora su Windows XP in cui http.sys non esiste. Questo vale anche per Mono, dove il sistema operativo sottostante può avere o meno un modulo simile a http.sys. Per quanto ne so, in tal caso il team di Mono cerca di fornire molti backend e uno di essi verrà acquisito in fase di runtime sulla base di OS/moduli rilevati. Dai un'occhiata a questo caso simile, "Quali sono i problemi con FileSystemWatcher?" in http://www.mono-project.com/FAQ:_Technical –