【发布时间】: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.Profiler的objRequest.Send(strBody)部分的原始时间吗?在我一直使用名为 TheSlTimingClass Library 的包装库之前没有使用原始分析器,它允许您更好地控制时间并生成摘要。 -
在上面的编辑中添加了它们。我停顿了一会儿,因为 SlTiming 库说 Softwing 的时间是十分之一毫秒(所以也许我只是忘记了除以 10)。但他们的own help 表示时间以毫秒为单位。
-
所以澄清
SlTiming是正确的,但Softwing.Profiler是错误的。如果您使用.ProfileStop(),请记住返回的值以刻度(十分之一毫秒) 为单位。很高兴我能提供帮助。
标签: vbscript asp-classic xmlhttprequest timing