【问题标题】:Classic ASP XMLHttp Send very slow经典 ASP XMLHttp 发送很慢
【发布时间】:2016-10-12 19:18:30
【问题描述】:

我继承了一个经典的 asp 项目,作为升级过程的一部分,我们将大量业务逻辑转移到 REST API (WebApi 2.2)

写了api的授权端点,asp站点可以调用,但是相比直接通过postman调用很慢。

(我是 C# 编码员而不是 VBScript 编码员,所以下面的代码可能会令人反感)

ASP 代码:

' Send a prebuilt HTTP request and handle the response
' Returns true if the request returns a 200 response, False otherwise 
' Response body is placed in Response
' ErrorMessage is set to return status text if an error code is returned  

Function HandleRequest(ByRef objRequest, strBody)
    set profiler = Server.CreateObject("Softwing.Profiler")
    HandleRequest = False

    ' Add auth token if we have it
    If Not m_accessToken&"" = "" Then
        objRequest.SetRequestHeader "Authorization", "Bearer " & m_accessToken 
    End If

    ' Originating IP for proxy forwarding
    If Not m_clientIp&"" = "" Then
        objRequest.SetRequestHeader "X-Forwarded-For", m_clientIp
    End If

    On Error Resume Next


    If (strBody&"" = "") Then
        objRequest.Send()
    Else
        profiler.ProfileStart()
        objRequest.Send(strBody)
        flSendRequest = profiler.ProfileStop()
    End If


    If Err.Number = 0 Then
        Dim jsonResponse

        If (objRequest.ResponseText&"" <> "") Then
            profiler.ProfileStart()
            set jsonResponse = JSON.parse(objRequest.ResponseText)
            flJson = profiler.ProfileStop()
            set m_Response = jsonResponse
        End If

        If objRequest.Status = 200 Then
            HandleRequest = True
            m_errorMessage = ""
        Else
            m_errorMessage = objRequest.statusText
        End If
    Else
        m_errorMessage = "Unable to connect to Api server"
    End If
    On Error GoTo 0
End Function

你可以看到那里有一些分析代码。

下面的post请求耗时392ms

POST localhost:5000/oauth/token
Content-Type application/x-www-form-urlencoded

client_id:ABCDEF0-ABCD-ABCD-ABCD-ABCDEF-ABCDEF01234
client_secret:aBcDeF0123456789aBcDeF0123456789=
username:demo
password:demo
grant_type:password

如果我通过 Postman 直接向 Api 发出相同的请求,则需要 30 毫秒。

慢了 13 倍以上。

什么给了?

编辑

来自 Softwing Profiler 的原始结果:

flJson          10.9583865754112    
flSendRequest   392.282022557137    

【问题讨论】:

  • 您是每次都从同一台机器发出请求,还是 ASP 代码与 Postman 不同?要使其成为有效的测试,您需要从同一位置运行两者。还要记住,COM 分析器会给代码执行增加一点开销。也怀疑这就是调用 ASP 页面时运行的所有 ASP 代码。
  • 同一台机器。一切都在本地完成。我还认为会有一个探查器开销,但这似乎过多。 (首先运行profiler的原因是正常运行时有明显的速度差异)
  • 你有来自Softwing.ProfilerobjRequest.Send(strBody) 部分的原始时间吗?在我一直使用名为 The SlTiming Class Library 的包装库之前没有使用原始分析器,它允许您更好地控制时间并生成摘要。
  • 在上面的编辑中添加了它们。我停顿了一会儿,因为 SlTiming 库说 Softwing 的时间是十分之一毫秒(所以也许我只是忘记了除以 10)。但他们的own help 表示时间以毫秒为单位。
  • 所以澄清SlTiming 是正确的,但Softwing.Profiler 是错误的。如果您使用.ProfileStop(),请记住返回的值以刻度(十分之一毫秒) 为单位。很高兴我能提供帮助。

标签: vbscript asp-classic xmlhttprequest timing


【解决方案1】:

所以在lengthy-ish discussion@J-Tolley 之后,看起来问题出在Softwing.Profiler documentation 上;

所有结果都以毫秒为单位

即使它在页面的前面声明;

有十毫秒的分辨率

以前没有单独使用过Softwing.Profiler 组件,建议任何在经典ASP 环境中使用的人使用4GuysFromRolla 提供的SlTiming class library 来实现它。

that article 中,它甚至会警告任何使用Softwing.Profiler ProfileStop() 方法的人;

请注意,Softwing.Profiler 的 ProfileStop 方法返回一个以滴答为单位的值(十分之一毫秒

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-05
    相关资源
    最近更新 更多