c# – .Net HttpListener.GetContext()向客户端提供“503 Service Unavailable”

c# – .Net HttpListener.GetContext()向客户端提供“503 Service Unavailable”,第1张

概述我想在C#中编写一个非常简单的自定义Http服务器. 实现连接的代码就像.Net提供的那样简单: // get our IPv4 address IPAddress[] localIPs = Dns.GetHostAddresses(Dns.GetHostName()); IPAddress theAddress = localIPs.Where(ip => ip.AddressFamily 我想在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()工作 – 使用’netsh http add urlacl …’为正确的用户正确保留URL.否则Start()将抛出.该URL也只保留一次.

我可以看到netstat -na正在监听端口.

我试图通过浏览器或wget的cygwin实现来访问它.两者都给我“ERROR 503:Service Unavailable.”.

这是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 Unavailable2016-03-06 14:54:37 ERROR 503: Service Unavailable.

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

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

windows事件日志中没有错误.

这是windows 10 Pro和Microsoft Visual Studio社区2015
版本14.0.23107.0 D14REL与Microsoft .NET Framework版本4.6.01038.

值得一提的是,我还测试了所有防火墙关闭,仍然是相同的结果.

有没有人知道GetContext()中可能出现什么问题以及我如何调试或解决这个问题?

======

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

解决方法 我还没有找到解决方案,而是一种解决方法.

有趣的是,如果我更深层次并使用普通的TcpListener,我可以毫无疑问地接收纯文本请求.

// Create a Tcp Listener. mTcpListener = new TcpListener(theaddress,port); Console.Writeline($"Trying to Listen on {theaddress}:{port}"); mTcpListener.Start(); Console.Writeline("Listening..."); Socket socket = null; try {     socket = mTcpListener.AcceptSocket(); } catch (Exception ex) {     Console.Writeline(ex.Message);     return; } // wait a little for the socket buffer to fill up await Task.Delay(20); int bytesAvailable = socket.Available; var completeBuffer = new List<byte>(); while (bytesAvailable > 0) {     byte[] buffer = new byte[bytesAvailable];     int bytesRead = socket.Receive(buffer);     completeBuffer.AddRange(buffer.Take(bytesRead));     bytesAvailable = socket.Available; } byte[] receivedBytes = completeBuffer.ToArray(); string receivedString = EnCoding.ASCII.GetString(receivedBytes);

… 奇迹般有效.返回的字符串是

GET /MyService/ http/1.1User-Agent: Wget/1.17.1 (cygwin)Accept: */*Accept-EnCoding: IDentityHost: 127.0.0.1:45987Connection: Keep-Alive

因此,作为一种解决方法,我可以实现我自己的http请求解析器和响应生成器…而不是我喜欢被迫重新发明轮子.

总结

以上是内存溢出为你收集整理的c# – .Net HttpListener.GetContext()向客户端提供“503 Service Unavailable”全部内容,希望文章能够帮你解决c# – .Net HttpListener.GetContext()向客户端提供“503 Service Unavailable”所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/langs/1226846.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-06-05
下一篇2022-06-05

发表评论

登录后才能评论

评论列表(0条)

    保存