【发布时间】:2023-03-03 06:08:24
【问题描述】:
我正在开发一个基于 C# .NET Framework 的 Web 服务库,它在端口 8733 上运行。现在我想快速创建一个控制台应用程序,它可以启动 ServiceHost 实例并托管服务,所以我不需要打开 VS 并对其进行调试以使 Web 服务运行。
这是我的脏控制台应用程序代码:
static void Main()
{
var host = new ServiceHost(typeof(WebService));
var bindig = new BasicHttpsBinding();
host.AddServiceEndpoint(typeof(IWebService), binding, new Uri("https://192.168.0.154:8733"));
host.Open();
Console.ReadLine();
}
但是当它遇到host.Open()时会抛出一个异常
System.ServiceModel.AddressAlreadyInUseException: 'HTTP 无法注册 URL https://+:8733/。另一个应用程序已经用 HTTP.SYS 注册了这个 URL。'
内部异常
HttpListenerException:无法侦听前缀“https://+:8733/”,因为它与机器上的现有注册冲突。
所以我想“哦,我只是忘了停止从 Visual Studio 运行的实例”,但不,它已停止。
所以我决定在以管理员身份运行的 PowerShell 窗口中使用netstat 进行调查。执行netstat -a -o -n -b 并将其传递到findstr "8733" 我得到结果
TCP 0.0.0.0:8733 0.0.0.0:0 LISTENING 4
TCP [::]:8733 [::]:0 LISTENING 4
现在我不知道为什么系统进程会保留 TCP 端口 8733,甚至在重新启动后仍然存在。我现在的问题是这个;如何手动绑定到这个端口?
P.S:回答为什么系统进程持有端口以及从 Visual Studio 运行时 Web 服务如何绑定到它的答案的奖励积分
【问题讨论】:
-
您确定自己没有安装/运行应用的实际服务版本吗? (系统进程打开 https 端口是正常的。)
-
您的代码不会停止服务本身。在the class's documemtation example shows 的末尾添加
host.Close()或将对象包装在using块中 -
@500-InternalServerError 该死,谢谢你的提问。我刚刚再次检查,Visual Studio 不再运行它,但 IIS 仍然注册它......仍然对 Visual Studio 如何仍然托管它感到非常困惑......
-
我认为这与您在后台获得的监听有关,因为 ServiceHost 在您的性能计数器上注册。 referencesource.microsoft.com/#System.ServiceModel/System/… 而你没有处理它
-
@PanagiotisKanavos 我非常清楚在使用主机时需要关闭主机,但目前我的问题是启动它(直到现在还没有工作)。我的控制台应用程序也在该 Console.ReadLine 之后退出,因此无论如何地址都会被释放