[.Net] Ajouter un Serveur Web dans une application DotNet

dotnet web server

De nombreuses applications intègrent directement un serveur Web afin de fournir à leur utilisateur une interface accessible sur pc, sur mobile et sur tablette.

Du coup, à force de voir mes clients me demander des applications accessibles sur Internet sans avoir à installer un apache, IIS, ou autre lamp, je me suis décidé à intégrer un serveur Web directement dans mes logiciels DotNet.

Par chance, il existe de nombreux exemples sur le Net permettant d’embarquer rapidement un web serveur dans une application.

Après consultation de la MSDN, il s’avère que la création d’un serveur web est un jeu d’enfant en utilisant le composant HTTPListener.

Voici donc une petite classe toute simple qui vous permettra d’insérer un serveur web dans vos applications C# ou VB.net.

La classe WebServer

'Classe permettant d'instancier un WebServer
Public Class WebServer
#Region "Properties"
    Private _listener As New HttpListener
    Private _responderMethod As Func(Of HttpListenerRequest, String)
#End Region
 
#Region "Constructeur"
    Public Sub New(ByVal prefixes() As String, ByVal method As Func(Of HttpListenerRequest, String))
        If Not HttpListener.IsSupported Then
            Throw New NotSupportedException("Needs Windows XP SP2, Server 2003 or later")
        End If
 
        'URI prefixes are required, for example "http://localhost:8080/index/".
        If prefixes Is Nothing Or prefixes.Length = 0 Then
            Throw New ArgumentException("No prefixes specified")
        End If
 
        'A responder method is required
        If method Is Nothing Then
            Throw New ArgumentException("No method specified")
        End If
 
        For Each s As String In prefixes
            _listener.Prefixes.Add(s)
        Next
 
        _responderMethod = method
        _listener.Start()
    End Sub
#End Region
 
#Region "Worker"
    Public Sub Start()
        ThreadPool.QueueUserWorkItem(Sub(o)
                                         Debug.WriteLine("Webserver running...")
                                         Try
                                             While _listener.IsListening
                                                 ThreadPool.QueueUserWorkItem(Sub(c)
                                                                                  Dim ctx As HttpListenerContext = DirectCast(c, HttpListenerContext)
                                                                                  Try
                                                                                      Dim rstr As String = _responderMethod(ctx.Request)
                                                                                      Dim buf() As Byte = Encoding.Default.GetBytes(rstr)
                                                                                      'ctx.Response.ContentLength64 = buf.Length
                                                                                      'ctx.Response.ContentEncoding = Encoding.UTF8
                                                                                      'ctx.Response.SendChunked = False
                                                                                      'ctx.Response.AddHeader("Content-Type", "application/json")
                                                                                      'ctx.Response.ContentType = "application/json"
                                                                                      'ctx.Response.KeepAlive = True
                                                                                      ctx.Response.AddHeader("Access-Control-Allow-Origin", "*")
                                                                                      'ctx.Response.AddHeader("Accept-Ranges", "bytes")
                                                                                      ctx.Response.OutputStream.Write(buf, 0, buf.Length)
 
                                                                                  Catch ex As Exception
                                                                                      'we delete all exceptions
                                                                                      Debug.WriteLine(ex.Message & vbCrLf & ex.StackTrace)
                                                                                  Finally
                                                                                      'we always close the stream
                                                                                      ctx.Response.OutputStream.Close()
                                                                                  End Try
                                                                              End Sub, _listener.GetContext())
                                             End While
                                         Catch ex As Exception
                                             Debug.WriteLine(ex.Message & vbCrLf & ex.StackTrace)
                                         End Try
                                     End Sub)
    End Sub
 
    Public Sub [Stop]()
        _listener.Stop()
        _listener.Close()
		Debug.WriteLine("Webserver stopped")
    End Sub
#End Region
End Class

 

Pour l’utiliser, il suffit de créer une fonction qui retournera le contenu de vos pages puis d’instancier un objet de type WebServer:

Private Function SendResponse(ByVal request As HttpListenerRequest) As String
	Return String.Format("<HTML><BODY>My web page.<br>{0}</BODY></HTML>", DateTime.Now)
End Function
 
Private Ws As New WebServer({"http://localhost:80/"}, AddressOf SendResponse)

Et voilà, il y a plus qu’à intégrer ce super serveur web dans vos applications dotnet.

Leave a Reply

Your email address will not be published. Required fields are marked *