簡體   English   中英

TCPListener的輔助角色停止工作

[英]worker role with TCPListener stops working

我正在運行這個非常基本的工作角色,監聽傳入的TCP連接並進行處理。 但是由於某種原因,現在過了一會兒就失敗了..似乎不再接收數據了……在跟蹤中沒有發現異常。 現在使其同步...仍然是同樣的問題。

這個想法是接受一個HTTP請求並給出302重定向。

當我通過端口80上的telnet連接到它時,它可以工作。

一旦我使用瀏覽器,它就會開始快速失敗。

之后,我在端口80上再次嘗試時,不再響應。

public class WorkerRole : RoleEntryPoint
{
    public override void Run()
    {
        TcpListener server = null;
        IPEndPoint ipin = RoleEnvironment.CurrentRoleInstance.InstanceEndpoints["Server"].IPEndpoint;
        server = new TcpListener(ipin);
        server.ExclusiveAddressUse = false;
        server.Start();

        try
        {
            while (true)
            {
                TcpClient client = server.AcceptTcpClient();
                HandleSyncConnection(client);
            }
        }
        catch (Exception ex)
        {
            Trace.WriteLine("Server stopped. Exception:" + ex.Message);
            return;
        }
    }
    private void HandleSyncConnection(TcpClient client)
    {
        try
        {
            // Setup reader/writer 
            NetworkStream netStream = client.GetStream();
            StreamReader reader = new StreamReader(netStream, Encoding.ASCII);
            StreamWriter writer = new StreamWriter(netStream, Encoding.ASCII);
            writer.AutoFlush = true;

            byte[] baBuffer = new byte[10000];
            byte[] baHeader = { 13, 10, 13, 10 };
            Int32 iTotalBytesReceived = 0;
            Int32 iHeaderFound = 0;

            while (iTotalBytesReceived < baBuffer.Length)
            {
              Int32 iBytesReceived = netStream.Read(baBuffer, iTotalBytesReceived, baBuffer.Length - iTotalBytesReceived);
              if (iBytesReceived == 0)
                   break;
              for (int i = 0; i < iBytesReceived; i++)
              {
                  if (baBuffer[iTotalBytesReceived + i] == baHeader[iHeaderFound])
                        iHeaderFound++;
                  else
                      iHeaderFound = 0;
              }
              iTotalBytesReceived += iBytesReceived;
              if (iHeaderFound == baHeader.Length)
                 break;
              Thread.Sleep(50);
            }

            String strResponse;
            Trace.TraceInformation("Request received");
            strResponse = "HTTP/1.1 302 Redirect" + EOL + "Location: http://www.google.com");
            strResponse += EOL + "Content-Type: text/html" + EOL + "Cache-Control: no-cache" + EOL + "Connection: close" + EOL + "Content-Length: 0" + EOL + EOL;
            writer.Write(strResponse);
            writer.Close();
            reader.Close();
            // Done! 
            client.Close();
          }
          catch (Exception e)
          {
            Trace.TraceError("Server stopped in the handling of sync " + e.Message);
          }
    }
    public override bool OnStart()
    {
        return base.OnStart();
    }

我認為問題不在於您的應用程序如何實現。

您是否考慮過Azure負載平衡超時?

這是一篇很好的博客文章,詳細介紹了它:

Windows Azure負載平衡器超時詳細信息

一分鍾左右,Azure將停止您的應用程序,而與您的實現無關。

看一看,看看這是否是您面臨的問題。

問候

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM