0

我的 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
4

0 回答 0