HttpListener返回错误的请求400

时间:2015-02-06 13:19:17

标签: c# .net delphi indy httplistener

我有下一个问题。我有一个使用HttpListener用c#编写的Windows服务。我的服务器类的代码:

public class SoaphttpServer
    {
        private HttpListener _listener;
        private readonly IniFile _settings;

        public bool Terminated { get; private set; }

        public void Terminate()
        {
            Terminated = true;
            Common.Cts.Cancel();
        }

        public SoaphttpServer()
        {
            _settings = Common.ReadSettings();
            Terminated = false;
            ServicePointManager.DefaultConnectionLimit = 500;
            ServicePointManager.Expect100Continue = false;
            ServicePointManager.MaxServicePoints = 500;
        }

        public void StartServer()
        {
            try
            {
                Common.Cts = new CancellationTokenSource();
                _listener = new HttpListener();
                _listener.Prefixes.Add("http://*:8012/");
                _listener.Start();
                while (!Terminated)
                {
                    IAsyncResult result = _listener.BeginGetContext(ListenerCallback, _listener);
                    while (!result.AsyncWaitHandle.WaitOne(1000))
                    {
                        if (Terminated) break;
                    }
                }
            }
            catch (Exception ex)
            {
                Log.Write("StartServer: " + ex.Message);
            }
        }

        public static async void ListenerCallback(IAsyncResult result)
        {
            Log.Write("new connection");
            HttpListener listener = (HttpListener)result.AsyncState;
            HttpListenerContext context = listener.EndGetContext(result);

            SoapHttpClient client = new SoapHttpClient(context);
            await client.SomeFuncAsync();
        }

        ~SoaphttpServer()
        {
            if (_listener == null) return;
            _listener.Stop();
            _listener.Close();
        }

    }

在命令行中我执行了下一个命令:

netsh http add urlacl url="http://*:8012/" user="NETWORK SERVICE"

一切都适用于所有地方。我可以接受来自broweser或使用IdHTTP的delphi程序的连接。但是,当我试图从一个程序连接时(我没有来自这个程序的代码),用delphi写入我的服务我进入这个程序:" HTTP / 1.1 400 Bad Request&# 34 ;.该程序的早期版本与我的服务配合得很好。我知道这个程序中的通信协议没有变化。我发现使用Wireshark GET数据包来到我的计算机,但是,因为我认为HttpListener形成了这个响应(错误的请求)并在没有我的情况下发回它。可能是什么问题?也许我可以调整HttpListener的一些方法并查看来自这个prog的传入请求并找出哪里出错了?

UPD。我发现HttpListener是密封类。我怎么能找到麻烦的地方?

1 个答案:

答案 0 :(得分:0)

谢谢大家!我找到了解决方案。

这一切都是因为默认情况下HttpListener无法解析长度超过255个符号的GET请求。 要解决此问题,您需要执行以下步骤:

  1. 添加到HKEY_LOCAL_MACHINE / SYSTEM / CurrentControlSet / services / HTTP / Parameters DWORD(32位)键并将其命名为" UrlSegmentMaxLength"并设置值= 0。

  2. 接下来需要重新启动http服务:

    net start http net stop http

  3. 这就是全部!一切都运作良好!