我继承了一个经典的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
你可以在那里看到一些分析代码。
以下帖子请求需要392毫秒
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发出相同的请求,则需要30ms。
这个速度慢了13倍。
是什么给出了?
修改
Softwing Profiler的原始结果:
flJson 10.9583865754112
flSendRequest 392.282022557137
答案 0 :(得分:2)
所以在使用lengthy-ish discussion的@J-Tolley之后,问题似乎是Softwing.Profiler
documentation指出的问题;
所有结果均以毫秒为单位
尽管它在页面的前面说明了;
的分辨率为10毫秒
以前没有单独使用Softwing.Profiler
组件,并建议使用Classic ASP环境中的任何人使用SlTiming
class library提供的4GuysFromRolla来实现它。
在that article中,它甚至会警告使用Softwing.Profiler
ProfileStop()
方法的任何人;
请注意,Softwing.Profiler的
ProfileStop
方法返回一个滴答值(十分之几毫秒)。