簡體   English   中英

如何加快慢速的GetResponse和GetRequest?

[英]How to speed up slow GetResponse and GetRequest?

我在ASP.NET C#中有一個網站運行速度很慢。 當我使用探查器對其進行檢查時,緩慢的兩個點是GetResponse和GetRequest。 我正在連接到第三方系統以獲取日歷的可用性,因此我正在通過POST與他們進行通信。 我們有一個ASP經典版本的副本,它看起來更快,但是我沒有簡單的方法來對其進行概要分析。

我正在發送一個大約440字節的字節編碼的XML字符串,具體取決於一些事情,返回值不到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;
}

您可以嘗試通過ServicePointManager.UseNagleAlgorithm = false禁用Nagle算法 ,請參閱MSDN

Nagle的(不良)影響會給您的POST請求增加至少半秒的額外延遲。 它與小型POST請求混合使用,因為它們在等待(讀取)響應之前會對底層TCP流進行兩次寫入。 在Nagle Wikipedia鏈接中查看詳細信息。

暫無
暫無

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

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