A pressão faz diamantes. Já falei isso por aqui, não?
Tenho recentemente trabalhado com alguns projetos mobile utilizando frameworks híbridos, como Ionic, Sencha e outros que surgem aos montes. A possibilidade de publicar tanto via browser como empacotar num cordova/phonegap dá a seu projeto uma expansibilidade generosa, podendo alcançar praticamente qualquer sistema operacional para usuários finais.
E assim vai. O fato é que, com isso em mente, pensei em fornecer uma solução nesse molde, só que para desktop. Se você é desenvolvedor web, sabe que não é suficiente abrir o arquivo html local no navegador para a execução de alguns scripts. Eles precisam ser “servidos” via HTTP. Ou seja, juntamente com o pacotão de htmls, css, js e tudo mais que seu app web tem, você precisa também de um servidor web. Para não mandar um apache para a máquina do seu usuário, ou mesmo ativar ou IIS, encontrei num canto da internet, mais especificamente o site CodePlex (se você não conhece, era esse cara quem mandava nos repositórios .NET antes do github entrar no ar) uma versão minimalista de um servidor http.
O código é bem “manual”, servindo as características de um servidor HTTP simples, respondendo a praticamente quaisquer tipos de arquivos. Os tipos servidos são definidos no web.config. Ele vêm com alguns exemplos configurados. Para atender à minha necessidade, obtive esta pequena lista:
http://www.sitepoint.com/web-foundations/mime-types-complete-list/
E adicionei. Por fim, minha solução estava rodando dentro de um aplicativo desktop, o mesmo um console, com um servidor HTTP embutido.
Para aprendizado, vale muito. O código manipula requisições na base do socket, tanto que a instância o servidor usa a classe TcpListener, ao invés do HttpListener, como outros exemplos utilizam, conforme listarei no fim do artigo:
_myListener = new TcpListener(IPAddress.Any, Port);
O código original oferece configuração de diretório raiz e documento padrão, além da porta de escuta, tudo via web.config.
O código, com algumas alterações, pode ser visto aqui:
https://github.com/Tomamais/httpdSharpForAll
O código original:
https://httpdsharp.codeplex.com
As alternativas
Não foi só isso que encontrei. Algumas alternativas foram igualmente interessantes, mas exigiam que você manipulasse cada request manualmente. São ótimos quando você quer especializar o processamento da resposta. São eles:
NHttp – https://github.com/pvginkel/NHttp
NancyFx (selfhost) – http://nancyfx.org/
Simple HTTP Server in C# – http://www.codeproject.com/Articles/137979/Simple-HTTP-Server-in-C
Simple C# Web Server – https://codehosting.net/blog/BlogEngine/post/Simple-C-Web-Server.aspx
HttpListener Class – https://msdn.microsoft.com/en-us/library/system.net.httplistener(v=vs.110).aspx
Já se o objetivo for somente servir arquivos simples, ou mesmo um SPA, a alternativa acima é ideal!
Bom proveito!