【问题标题】:C# TcpListener Chrome issueC# TcpListener Chrome 问题
【发布时间】: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


【解决方案1】:

我建议进一步研究 chrome 的行为。这可以使用应用程序Fiddler 来完成,以查看浏览器正在发出哪些网络请求。

您可能还希望禁用浏览器上的所有扩展程序,因为这些扩展程序也可能会发出请求。还可以尝试使用带有单个选项卡的单个 chrome 实例(这是一个很长的镜头,但只是为了消除任何无意行为发生的可能性)。

【讨论】:

    猜你喜欢
    • 2016-03-17
    • 2011-07-20
    • 2014-04-03
    • 1970-01-01
    • 2011-04-07
    • 2019-02-07
    • 2012-05-13
    • 2011-10-06
    • 1970-01-01
    相关资源
    最近更新 更多