我的 WebServices 日志记录有一个奇怪的问题。
我们为公司提供后端服务。他们托管前端并使用我们的 WS 来提取客户端数据。当他们调用我们的 WS 时,我们调用他们的 WS 来验证用户并在一切正常时继续,或者由于任何其他原因(异常、超时等)返回错误代码。
他们一直在使用我们的 Web 服务(超时、性能低下),因此我们引入了登录 WS 以尝试跟踪请求/响应时间。WS 日志记录由 2 条记录组成 - 请求和响应。
调用 WS 后会立即创建请求记录,其中包括客户提供的所有相关信息(帐号、电话等)。它还生成并记录请求一个唯一的 HashId,它是请求和响应之间的链接。如果没有 HashId,将很难链接请求/响应,因为响应可能会在 10 秒后出现,并且日志之间会有数千条记录。
响应在 WS 结束时创建,它记录响应和之前创建的 HashID。
每个 WS 都有错误捕获,如果发生异常,将使用在 WS 调用开始时创建的 HashID 写入错误日志。
问题是:大约 90-95% 的请求都有相应的响应。但是有记录有请求,但是没有对应HashID的响应,也不例外。更奇怪的是,我们的响应没有对应的请求日志!如果第一步是记录请求并且 HashId 只分配一次,那怎么可能呢?需要注意的一件事 - 流量很大,每秒有 10 到 20 个独特的呼叫。
这是我们的一个非常简单的 WS(我删掉了一些代码,但原理还是一样的——记录请求,初始化 WS 对象和响应对象,调用另一个 WS,如果没有异常则记录响应,如果异常则记录错误):
Public Function getAccountBills(ByVal AccountID As String, Optional ByVal PinCode As String = "") As Boolean
Dim request As New Bills.getAccountBills
Dim response1 As Bills.getAccountBillsResponse
Dim client As New Bills.AccountBillsRetrieveClient
Dim hashID As String = ""
Try
' generate unique HashID using supplied parameters, date and a random string
hashID = GetLogHash(AccountID & PinCode & Now.ToString & GetRandomString)
'log request with HashID and client supplied parameters
Log(String.Format("REQUEST ({3}): HashID=[{0}], AccountID=[{1}], PinCode=[{2}]", hashID, AccountID, PinCode))
' set up WS object
SetupWebService(client, "AccountBillSummaryRetrieve")
' setup a response object
request.AccountBillsRetrieveV1Request = New Bills.AccountBillsRetrieveV1Request
' call client WS with paramaters and get a response
response1 = client.retrieveAccountBills("ABCD", "1234", request)
' log response with HashID
Log(String.Format("RESPONSE ({1}) OK: HashID=[{0}]", hashID))
Return True
Catch ex As Exception
' Log
Log(String.Format("RESPONSE ({1}) ERROR: HashID=[{0}] Error=[{1}]", hashID, ex.ToString))
Return False
End Try
End Function