自托管Web Api服务到Windows窗体

本文关键字:Windows 窗体 服务 Api Web | 更新日期: 2023-09-27 17:52:34

我正在尝试使用下面的代码在windows窗体应用程序中自我托管Web Api服务

namespace MascoteAquarium.Desktop
{
    static class Program
    {
        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        [STAThread]
        static void Main()
        {
            var config = new HttpSelfHostConfiguration("http://localhost:8080");
            config.Routes.MapHttpRoute(
                "DefaultApi", "api/{controller}/id", new { id = RouteParameter.Optional });
            using (HttpSelfHostServer server = new HttpSelfHostServer(config))
            {
                server.OpenAsync().Wait();
            }
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new frmMainMenu());
        }
    }
}

当我尝试

http://localhost:8080/api/*(some-controller)* 

我收到一个NullReferenceExceptionSystem.Web.Http.SelfHost.HttpSelfHostServer。ProcessRequestContext(ChannelContext ChannelContext, RequestContext RequestContext)

有人知道发生了什么吗?它是可能的自我主机在一个winforms应用程序?

自托管Web Api服务到Windows窗体

问题在于HttpSelfHostServer对象在Application.Run(…)之前丢失,而对象包含保持程序运行的主事件循环。using语句确保为对象调用Dispose方法,在本例中为服务器,从而使其不可用于应答请求,导致您正在经历的NullReferenceException。要修复这个异常,你的代码应该像这样:

...
using (HttpSelfHostServer server = new HttpSelfHostServer(config))
{
    server.OpenAsync().Wait();
    Application.EnableVisualStyles();
    Application.SetCompatibleTextRenderingDefault(false);
    Application.Run(new frmMainMenu());
}
...
  1. 你需要运行WinForms应用程序(或VS,如果你从调试器运行WinForm应用程序)以提升权限(作为Admin),否则自主机将不允许打开端口

  2. 确保8080端口上没有其他应用程序正在运行