【发布时间】:2016-02-09 21:24:58
【问题描述】:
我在尝试从 Google Chrome 发出 HTTP GET 请求时遇到了异常问题。
我有一个简单的HttpServer如下:
public class HttpServer
{
#region Attributes ----------------------------------------------------
protected Int32 Port;
private TcpListener listener;
private Boolean closed;
#endregion
#region Properties (Own Members) --------------------------------------
internal String Folder { get; private set; }
#endregion
#region Constructors --------------------------------------------------
#endregion
#region Methods (Own Members) -----------------------------------------
public void Start(Int32 port, String folder)
{
if (!Directory.Exists(folder))
throw new ArgumentException("folder");
closed = false;
this.Folder = folder;
var ipLocal = IPAddress.Parse(NetUtils.GetLocalIPv4()); // My own stuff to get
this.Port = port;
listener = new TcpListener(ipLocal, Port);
listener.Start();
StartAccept();
}
public void Stop()
{
if (listener == null) return;
closed = true;
listener.Stop();
listener = null;
}
private void AcceptCallback(IAsyncResult ar)
{
if (closed) { return; }
StartAccept();
var client = listener.EndAcceptTcpClient(ar);
var processor = new HttpProcessor(client, this);
processor.Start();
}
private void StartAccept()
{
listener.BeginAcceptTcpClient(AcceptCallback, listener);
}
#endregion
}
HttpProcessor 是一个管理客户端和服务器之间数据交换的类,这里不是问题。
我照常设置服务器:
var httpServer = new HttpServer();
httpServer.Start(localPort, "somepath");
问题来了。 当我在 Mozilla Firefox 上写“http://localIpAddr:localPort/somepath/somefile”时,它会进入 AcceptCallback 一次(如预期的那样),但在 Google Chrome 上写相同的 url 会导致调用该方法两次。
谁能解释一下这里有什么问题?提前致谢。
【问题讨论】:
-
我建议您查看收到的请求。我的猜测是一个图标文件或类似文件。
-
我正在请求音频文件,例如“ip:port/file.wav”。事实上,在 Firefox 中我可以正确下载文件,而在 Chome 中,第一个调用会下载文件,但第二个调用会永远等待。不明白为什么它只在 Chrome 上被调用了两次。
-
其中一个连接可能是能够并行请求
favico.ico。查看传入请求的 URL。无论哪种方式,HTTP 客户端都可以打开任意数量的连接。
标签: c# google-chrome tcplistener