在 Windows 平臺 Web 服務一般托管於 IIS. 在開發中, 會遇到 WinForms 或 WPF 服務端程式需要提供對外 API 作為服務. 在本文詳細介紹 WebApi 自托管於 WinForms 中, WPF 或 Console 程式實現類似. ...
實現 WebApi 自托管服務宿主於 WinForms 及其交互
在 Windows 平臺 Web 服務一般托管於 IIS. 在開發中, 會遇到 WinForms 或 WPF 服務端程式需要提供對外 API 作為服務. 在本文詳細介紹 WebApi 自托管於 WinForms 中, WPF 或 Console 程式實現類似.
0. 完整示例演示
1. 新建解決方案以及 WinForms 工程
1.1 新建解決方案及工程
如下圖所示:
1.2 拖拽控制項
繪製必要控制項, 佈局如下:
備註: 繪製一個 NumericUpDown 和兩個 Button 控制項.
2. 開發 HTTP 服務類
/// <summary>
/// HTTP service.
/// </summary>
public class HttpService
{
/// <summary>
/// HTTP self hosting.
/// </summary>
private HttpSelfHostServer _server;
#region HTTP Service
/// <summary>
/// start HTTP server.
/// </summary>
/// <param name="port">the port of the http server</param>
public void StartHttpServer(string port)
{
var config = new HttpSelfHostConfiguration($"http://0.0.0.0:{port}");
config.MapHttpAttributeRoutes();
config.Routes.MapHttpRoute("DefaultApi", "api/{controller}/{action}");
this._server = new HttpSelfHostServer(config);
this._server.OpenAsync().Wait();
}
/// <summary>
/// Close HTTP server.
/// </summary>
public void CloseHttpServer()
{
this._server.CloseAsync().Wait();
this._server.Dispose();
}
#endregion
}
WebApi 自托管服務主要由 HttpSelfHostServer
實現.
config.MapHttpAttributeRoutes();
可以在 Controller
中使用路由特性.
3. 調用 HTTP 服務
在 MainForm 窗體程式中引用 HTTP 服務:
public class MainForm:Form
{
/// <summary>
/// Http service.
/// </summary>
private readonly HttpService _http;
public MainForm()
{
/**
* initialize http service.
*/
_http = new HttpService();
}
}
3.1 編寫開啟 HTTP 服務代碼
/// <summary>
/// start the http server.
/// </summary>
private void StartButton_Click(object sender, EventArgs e)
{
/**
* start.
*/
try
{
var port = this.PortNum.Value;
_http.StartHttpServer($"{port}");
}
catch (Exception exception)
{
MessageBox.Show($"{exception.Message}", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
3.2 編寫關閉 HTTP 服務代碼
/// <summary>
/// close the http server.
/// </summary>
private void CloseButton_Click(object sender, EventArgs e)
{
/**
* close.
*/
try
{
_http.CloseHttpServer();
}
catch (Exception exception)
{
MessageBox.Show($"{exception.Message}", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
4. 開發控制器
/// <summary>
/// Home controller.
/// </summary>
[RoutePrefix("api/home")]
public class HomeController : ApiController
{
/// <summary>
/// Print the greetings
/// </summary>
/// <param name="name">visitor</param>
/// <returns>greetings</returns>
[Route("echo")]
[HttpGet]
public IHttpActionResult Echo(string name)
{
return Json(new {Name = name, Message = $"Hello, {name}"});
}
}