概要
HTTPクライアントを用いてテストを行う際、ダミーのエンドポイントとなるWebサーバを構築します。
.NET CoreにはKestrelというWebサーバがあるため、折角なので利用してみました。
環境
- Windows10
- Visual Studio 2019
- .NET Core 2.2
- Docker for Windows
コードサンプル
サンプルコードを Github にアップしています。
https://github.com/tYoshiyuki/dotnet-core-mock-web-server
解説
コンソールアプリケーションをベースにASP.NET Coreでお馴染みのIWebHostBuilderを作成します。
public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseStartup<Startup>();
HTTPのパイプライン処理にロジックを追記します。
HTTPアクセス時のヘッダやボディ情報等を出力します。
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
app.Run(async (context) =>
{
var req = context.Request;
var output = new List<string>
{
"-------------Request Information Start-------------",
$"Time[{DateTime.Now}]",
$"Scheme[{req.Scheme}]",
$"Path[{req.Path}]",
$"QueryString[{req.QueryString}]",
$"Method[{req.Method}]",
$"ContentLength[{req.ContentLength}]",
$"ContentType[{req.ContentType}]",
"-------------Body-------------"
};
using (var reader = new StreamReader(req.Body))
{
var body = reader.ReadToEnd();
output.Add(body);
}
output.Add("-------------Headers--------------");
output.Add($"Headers Count[{req.Headers.AsEnumerable().Count()}]");
foreach (var h in req.Headers.AsEnumerable())
{
output.Add($"{h.Key}[{h.Value}]");
}
output.Add("-------------Request Information End-------------");
_logger.LogInformation(string.Join(Environment.NewLine, output));
await context.Response.WriteAsync("Request Success");
await context.Response.WriteAsync(Environment.NewLine);
await context.Response.WriteAsync(string.Join(Environment.NewLine, output));
});
}
デバッグ起動しブラウザでアクセスすると、アクセス時の情報が表示されます。
Dockerイメージ
DockerイメージをDocker Hubに登録しました。Dockerfileの生成はVisual Studioの機能を利用して実施しています。
上記、Githubのページにdocker-compose.ymlを同梱しています。
docker-compose up -d
30080ポートでアクセスすると、アクセス時の情報が表示されます。