2016-02-09 50 views
0

嘗試從Google Chrome執行HTTP GET請求時出現引渡問題。C#TcpListener Chrome問題

我有一個簡單的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中輸入一次(如預期),但在Chrome瀏覽器上寫入相同的url會導致調用該方法兩次。

任何人都可以解釋我這裏有什麼問題嗎?提前致謝。

+1

我建議你看看收到的請求。我的猜測是,一個將是一個圖標文件或類似的東西。 –

+0

我正在請求音頻文件,例如「http:// ip:port/file.wav」。事實上,在Firefox中,我可以正確下載文件,並且在第一次調用下載文件,但第二次永久等待。不明白爲什麼它只在Chrome上調用兩次。 – Alex

+2

其中一個連接可能能夠並行請求'favico.ico'。查看傳入請求的URL。無論哪種方式,HTTP客戶端可以打開儘可能多的連接。 – jgauffin

回答

0

我建議進一步瞭解chrome的行爲。這可以通過使用應用程序Fiddler來查看瀏覽器正在進行的網絡請求。

您可能還需要禁用瀏覽器上的所有分機,因爲這些也可能是發出請求。嘗試使用單個選項卡的單個實例鉻(這是一個遠射,但只是爲了消除任何無意中發生的行爲的可能性)。