是啥导致 HttpListener HTTP 503 错误?

Posted

技术标签:

【中文标题】是啥导致 HttpListener HTTP 503 错误?【英文标题】:What causes a HttpListener HTTP 503 error?是什么导致 HttpListener HTTP 503 错误? 【发布时间】:2011-12-29 20:30:27 【问题描述】:

所以,我们有一个大型程序,它使用 HttpListener 来实现一个小的远程管理功能。由于我不明白的原因,有些人遇到了 503 错误的问题。

由于我们没有提供错误,因此框架中发生了一些事情。现在,我的问题是,框架内部是什么提供了这个错误?是前缀设置不正确还是怎么的?

我们目前将前缀设置为“http://*:8080/”。

建议?

【问题讨论】:

它是否有时会工作而不会出现错误 503? 我不确定。这是一个有麻烦的客户。如果它是/不是恒定的,有什么建议吗? 如果不是恒定的,我听起来不像是权限问题... 【参考方案1】:

在尝试使用 netsh http 命令为 HttpListener 设置权限时,我在 Windows 7 上遇到了同样的错误。 在目标系统上运行命令(适用于 Windows 7):

netsh http show urlacl    

并检查您的网址“http://+:8080/”是否已出现在保留网址列表中。尝试从列表中删除(使用“netsh http delete urlacl”。类似主题here。

【讨论】:

很好的答案,我遇到了同样的问题:我的一个测试使用了 HttpSelfHostConfiguration 类,该类需要保留它使用的 url(通过 netsh),而另一个使用 HttpListener 的测试在我抛出 HTTP 503 错误时想要访问它,因为该 url 是在第一次测试之前保留的。 我在尝试访问在自定义端口上运行的 HttpListener 时遇到了同样的问题(503 错误)。我在运行show urlacl 后找到了该URL,并使用delete urlacl [custom URL:port] 将其删除。之后它起作用了。谢谢。 它可以工作,但是为什么在关闭我使用该 URL 的应用程序后,即使在重新启动 Windows 后,该 URL 仍然保留? 因为保留的 URL 列表是系统范围的,不依赖于任何进程的运行状态。 是的,我这样做:【netsh http add urlacl url=http://*:8080/ user=everyone listen=yes】和【netsh http delete urlacl url=http://+:8080/】,它对我有用!【参考方案2】:

这个问题我有点晚了。但是我只是在以下情况下遇到了HTTP 503状态码:

例如,如果使用 netsh http add urlacl 注册了“http://+:8080/MyService/”“http://+:8080/MyService/SOAP”,我们会收到针对不明确 URL 的请求的 503。对“http://myservice:8080/MyService/somethingelse”的请求工作正常,而对“http://myservice:8080/MyService/SOAP/”的请求失败,状态为 503。

为了完整起见,添加了这个。我花了一段时间才弄清楚。

【讨论】:

【参考方案3】:

确保您的 HttpListenerurlacl 匹配。

以 (C#) 方式启动您的侦听器:

using System;
using System.Net;
using System.ServiceModel;

namespace Example

    class MyApi
    
        private const int _apiPortNumber = 8080;
        public const string BasePath = "/myApi/";
        public static EndpointAddress MyEndPoint => new EndpointAddress(
            new UriBuilder(
                    Uri.UriSchemeHttp,
                    "localhost",//only allow connections on localhost (no remote access)
                    _apiPortNumber,
                    BasePath)
                .Uri);

        public MyApi()
        
            var httpListener = new System.Net.HttpListener();
            httpListener.Prefixes.Add(MyEndPoint.Uri.ToString());
            httpListener.Start();
        
    

urlacl 的作用是:

netsh http add urlacl url=http://127.0.0.1:8080/myApi/ user=MyServiceUserName

但是,如下配置您的 urlacl 将不起作用:

http add urlacl url=http://+:8080/myApi/ user=MyServiceUserName

【讨论】:

以上是关于是啥导致 HttpListener HTTP 503 错误?的主要内容,如果未能解决你的问题,请参考以下文章

通过HttpListener实现简单的Http服务

为啥 HttpListener 在侦听强通配符 (http://+:port) http.sys/urlacl 绑定时“与现有注册冲突”?

C# HttpListener 和 Windows 防火墙

HttpListener:写入输出流的速度取决于内容?

替代 HttpListener?

C#使用HTTPListener异步实现HTTP服务端,请求执行两次