.net framework 3.5でスタンドアロンで簡単にウェブサーバを立てる
Wikiエンジンを作るために,IISなどサーバを立てずに,アプリケーションからスタンドアロンでウェブサービスを提供するので,ちょっとはまったのでメモ.
方法自体はWCFを使うウェブサービスの作り方そのもの.
HTTPレスポンスのヘッダで Content-Type = "text/html"を指定すること,コンテンツにSystem.IO.Streamを渡すことの2点がポイント.
具体的には,まずサービスを定義する:
using System.ServiceModel;
using System.ServiceModel.Web;
namespace Belka.BookOfNightSky.Accessor
{
[ServiceContract(Namespace="")]
public interface IWikiService
{
[OperationContract]
[WebGet(UriTemplate="/{wikipage}")]
System.IO.Stream Get(string wikipage);
}
}
次にこのインタフェースの実装クラスを書く:
using System.ServiceModel;
using System.ServiceModel.Web;
namespace Belka.BookOfNightSky.Accessor
{
public class WikiService : IWikiService
{
string _xmldecl = "<?xml version=\"1.0\" encoding=\"utf-8\" ?>";
string _doctype = "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\" \"http://www.w3c.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">";
string _content = "<html xmlns=\"http://www.w3.org/1999/xhtml\" xml:lang=\"ja\" lang=\"ja\"><header><title>test page</title></header><body>test page</body></html>";
#region IWikiService メンバ
public System.IO.Stream Get(string wikipage)
{
// レスポンスヘッダは, WebOperationContext.Current.OutgoingResponse のプロパティを通して設定できる.
WebOperationContext.Current.OutgoingResponse.ContentType = "text/html; charset=utf-8;";
MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(_xmldecl + _doctype + _content));
return ms;
}
#endregion
}
}
最後にメインのメソッドでサービスを起動する:
System.ServiceModel.Web.WebServiceHost _host; void Main() { _host = new WebServiceHost(typeof(WikiService), new Uri("http://localhost:8000/wiki")); _host.Open(); }
これで,例えば http://localhost:8000/wiki/some-wiki-page にアクセスすれば,コンテンツがブラウザに表示される.