gpt4 book ai didi

c# - .Net HttpListener.GetContext() 给客户端 "503 Service Unavailable"

转载 作者:太空狗 更新时间:2023-10-29 23:50:04 27 4
gpt4 key购买 nike

我正在尝试用 C# 编写一个非常非常简单的自定义 Http 服务器。

实现连接的代码与 .Net 提供的一样简单:

 // get our IPv4 address
IPAddress[] localIPs = Dns.GetHostAddresses(Dns.GetHostName());
IPAddress theAddress = localIPs.Where(ip => ip.AddressFamily == AddressFamily.InterNetwork).FirstOrDefault();

// Create a http listener.
var listener = new HttpListener();
string myUrlPrefix = $"http://{theAddress.ToString()}:{port}/MyService/";
listener.Prefixes.Add(myUrlPrefix);
Console.WriteLine($"Trying to listen on {myUrlPrefix}");
listener.Start();
Console.WriteLine("Listening...");
HttpListenerContext context = null;
try
{
context = listener.GetContext();
}
catch(Exception ex)
{
Console.WriteLine(ex.Message);
}

HttpListenerRequest request = context.Request;

运行时,GetContext() 会阻塞,从不返回,也不会抛出异常。

listener.Start() 有效——URL 已正确保留给正确的用户,使用“netsh http add urlacl...”,否则 Start() 会抛出错误。该 URL 也只保留一次

我可以通过 netstat -na 看到端口正在被监听。

我正在尝试使用浏览器或 wgetcygwin 实现来访问它。两者都给我 “错误 503:服务不可用。”

这是 wget 的输出:

$ wget http://127.0.0.1:45987/MyService/
--2016-03-06 14:54:37-- http://127.0.0.1:45987/MyService/
Connecting to 127.0.0.1:45987... connected.
HTTP request sent, awaiting response... 503 Service Unavailable
2016-03-06 14:54:37 ERROR 503: Service Unavailable.

这意味着 TCP 连接已建立,但 HttpListener.GetContext() 不会为请求提供服务并为我提供上下文,它也不会至少抛出异常来告诉我出了什么问题。它只是关闭连接。从调试输出来看,它甚至没有内部会捕获自己的 First-Chance 异常。

我上下搜索了 Net 和 Stackoverflow,没有找到任何有用的东西。

Windows 事件日志中没有错误。

这是 Windows 10 专业版和 Microsoft Visual Studio Community 2015版本 14.0.23107.0 D14REL,带有 Microsoft .NET Framework 版本 4.6.01038。

可能值得一提的是,我也在关闭所有防火墙的情况下对此进行了测试,结果仍然相同。

有没有人知道 GetContext() 可能出了什么问题,我该如何调试或解决这个问题?

======

编辑:我启用了 .Net Framework 源步进并进入了 GetContext()。阻止和拒绝服务 http 请求发生在称为“UnsafeNclNativeMethods.HttpApi.HttpReceiveHttpRequest”的东西中,我猜这可能是 native HttpReceiveHttpRequest 方法,记录在 https://msdn.microsoft.com/en-us/library/windows/desktop/aa364495(v=vs.85).aspx 中。 .所以是 native API 拒绝了我的请求。

最佳答案

我刚刚遇到了同样的问题,这是由 URL ACL 引起的。

从提升的命令提示符

netsh http show urlacl 将显示所有 URL ACL

netsh http delete urlacl http://+:1234/ 将删除 URL 为 http://+:1234/

的 URL ACL

netsh http add urlacl url=http://+:1234/user=Everyone 将添加一个任何本地用户都可以监听的 URL ACL(通常这应该使用网络服务帐户)

此 URL 需要与您的 HttpListener 中的前缀匹配。

如果您只在本地主机上监听,则不需要 URL ACL。

通常没有正确的 URL ACL 会导致在启动监听器时出现权限错误。我不确定是什么具体情况导致它通过此操作,但随后在 GetContext 上返回 503 Service Unavailable。

关于c# - .Net HttpListener.GetContext() 给客户端 "503 Service Unavailable",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35822989/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com