我有下一个问题。我有一个使用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是密封类。我怎么能找到麻烦的地方?
答案 0 :(得分:0)
谢谢大家!我找到了解决方案。
这一切都是因为默认情况下HttpListener无法解析长度超过255个符号的GET请求。 要解决此问题,您需要执行以下步骤:
添加到HKEY_LOCAL_MACHINE / SYSTEM / CurrentControlSet / services / HTTP / Parameters DWORD(32位)键并将其命名为" UrlSegmentMaxLength"并设置值= 0。
接下来需要重新启动http服务:
net start http net stop http
这就是全部!一切都运作良好!