2013-10-21 31 views
0

我有一個在ASP.NET C#中的網站,運行速度很慢。當我使用分析器來檢查它時,緩慢的兩個點是GetResponse和GetRequest。我連接到第三方系統以獲取日曆上的可用性,所以我通過POST與他們進行通信。我們有一個在ASP經典的對手,它似乎更快,但我沒有簡單的方法來分析它。如何加速緩慢的GetResponse和GetRequest?

我送一個XML字符串字節編碼那是周圍440個字節,取決於一些東西,回報是在2K。我在這裏包括了大部分相關的例程。我試着設置默認的代理服務器爲GetEmptyWebProxy,以防萬一,當我閱讀它可以幫助。

處理請求/響應花費2到5秒。由於老闆正在計算河馬的壓力,因此我無法獲得經典版本的真實數據,所以在這一點上都是知覺。

我的問題是這樣的 - 我是否可以儘可能快地做事,這是野獸的性質還是我可以做的事情來加速這種溝通?任何幫助不勝感激。

下面是一些代碼:

protected void UpdateInventory(DateTime _SelectedDate) 
{ 
    // build request object 
    Envelope _Request = new Envelope(); 
    _Request.Body = new Body(); 
    _Request.Body.QueryEvents = new QueryEvents(); 
    _Request.Header = new Header(); 

    //setup search criteria for API request 
    _Request.Body.QueryEvents.EventRangeBeginDate = _SelectedDate.ToString(_DTFormat); 
    _Request.Body.QueryEvents.EventRangeEndDate = _SelectedDate.AddDays(1).ToString(_DTFormat); 
    _Request.Body.QueryEvents.EventTypeID = _EventTypeId; 
    _Request.Header.SourceID = "BackOffice"; 
    _Request.Header.MessageID = 0; 
    _Request.Header.MessageType = "QueryEvents"; 
    _Request.Header.TimeStamp = LocaleHelper.LocalNow.ToString(_DTFormat); 
    _Request.Header.EchoData = "BO Calendar"; 

    // send API request 
    HttpStatusCode _Status = GetGatewayInventory(_Request); 
} 

protected HttpStatusCode GetGatewayInventory(Envelope _InvRequest) 
{ 
    // set up return value 
    HttpStatusCode _RetVal = HttpStatusCode.Unused; 

    // initialize global inventory object 
    _Inventory = new Envelope(); 

    // serialize request object into XML 
    XmlSerializer _Serializer = new XmlSerializer(_InvRequest.GetType()); 
    MemoryStream _Stream = new MemoryStream(); 
    _Serializer.Serialize(_Stream, _InvRequest); 

    XmlDocument _Doc = new XmlDocument(); 
    _Stream.Position = 0; 
    _Doc.Load(_Stream); 

    // remove unneeded info. 
    XmlNode _Node = _Doc.SelectSingleNode("/Envelope"); 
    XmlElement _ENode = (XmlElement)_Node; 
    _ENode.RemoveAttribute("xmlns:xsi"); 
    _ENode.RemoveAttribute("xmlns:xsd"); 

    // clean up 
    string _XmlStr = _Doc.InnerXml.Replace("\"1.0\"", "'1.0'"); 
    byte[] _Bytes = System.Text.Encoding.ASCII.GetBytes(_XmlStr); 

    // send string to gateway 
    // set web request 
    string _GWHost = _GatewayHostLive; 

    HttpWebRequest _req = (HttpWebRequest)WebRequest.Create(_GWHost); 

    IWebProxy myProxy = GlobalProxySelection.GetEmptyWebProxy(); 
    GlobalProxySelection.Select = myProxy; 
    _req.Proxy = myProxy;  

    _req.Method = "POST"; 
    _req.ContentLength = _Bytes.Length; 
    _req.ContentType = "text/xml; encoding='utf-8'"; 

    Stream _RequestStream = _req.GetRequestStream();   
    _RequestStream.Write(_Bytes, 0, _Bytes.Length); 
    _RequestStream.Close(); 

    using (HttpWebResponse _Resp = (HttpWebResponse)_req.GetResponse()) 
    { 
     _RetVal = _Resp.StatusCode; 

     if (_Resp.StatusCode == HttpStatusCode.OK) 
     { 
      Stream _respStream = _Resp.GetResponseStream(); 
      XmlTextReader _xmlreader = new XmlTextReader(_respStream); 
      XmlDocument _RespXml = new XmlDocument(); 
      _RespXml.Load(_xmlreader); 
      _xmlreader.Close(); 

      // deserialize back into object 
      StringReader _sr = new StringReader(_RespXml.InnerXml); 
      XmlSerializer _XmlSr = new XmlSerializer(_Inventory.GetType()); 
      XmlReader _Inreader = new XmlTextReader(_sr); 
      _Inventory = (Envelope)_XmlSr.Deserialize(_Inreader); 

      StripExtrasIfOnlyShowFirstAvailable(_Inventory, CountTotalTickets()); 

      grd_EventTimes.DataSource = _Inventory.Body.Events.Event; 
      grd_EventTimes.DataBind(); 
      grd_EventTimes.Visible = true; 
      if (_Inventory.Body.Events.Event.Count > 0) 
       lbl_GatewayId.Text = "GN: " + _Inventory.Body.Events.Event[0].EventName + " ID:" + _EventTypeId ; 
     } 
     _Resp.Close(); 
    } 
    // exit and return value 
    return _RetVal; 
} 
+0

試過http://stackoverflow.com/a/3603413/1236044? – jbl

+0

是的,我試着第一次發現GetEmptyWebProxy是首選,但我都嘗試了兩種。 – Deverill

+0

順便說一句,服務是SSL/TLS嗎? – jbl

回答

0

你可以嘗試通過Nagle algorithmServicePointManager.UseNagleAlgorithm = false禁用,看到MSDN

Nagle的(壞)影響會給您的POST請求增加至少半秒的額外延遲。它與小的POST請求混合嚴重,因爲在等待(讀取)響應之前,它會對基礎TCP流執行兩次寫入操作。請參閱Nagle Wikipedia鏈接中的詳細信息。

相關問題