[VBScript] 單緒有 Timeout 的 AJAX

前篇有提到:[VBScript] 傳遞陣列到 VB6 的物件

我工作上有讓一隻 VB6 的程式支援 VBScript ,藉此來呼叫外部巨集的方式來處理非標準的功能。

這次碰上一家德國自訂通訊協定的設備,雖然提供 RS-485 通訊,但他的自訂通訊範例很怪,剪貼後跑起來不對勁,而且裡面的二進位變量沒解釋。設備商有提供 WebBox 接 RS-485 ,透過 WebBox 通訊,就可以使用 Modbus TCP 或 RFC over http ,由於使用的設備為最新型,目前在韌體內還不支援 WebBox ,所以只能先用 RFC 來通訊,整合還算單純,使用 JSON 格式來發命令,設備回應。

嵌入外掛的 VBScript 前,開發測試就用 DHTML 來做,同時測發送的訊號,接收的內容,RegExp 正規運算式解析字串的結果。

所以當然就是用 AJAX ,xmlHttpRequest 這個物件。

一開始寫,沒啥太大的問題,IE 中配合 VBScript ,自動嘗試建立物件:

  1. MSXML2.XMLHTTP.3.0
  2. MSXML2.XMLHTTP
  3. Microsoft.XMLHTTP

遷移到 VBScript 則可直接使用。

由於是要給 VB6 呼叫,設計上是單緒,並沒使用非同步呼叫,所以無法處理 xmlHttp 事件。這周要上線了,先把參數設好,才發現,VB6 那邊一直跳 VBScript Timeout ,查了一下,同步呼叫 xmlHttp.send 後,加上 nslookup, Connect, send, receive 林林總總大概要 90 秒,VBScript 當然可以把逾時加大,但是設備數有 17 個,逾時加大的話,整個輪詢時間會很久,此外還同時有 4 個 Modbus RTU, 2 個 Modbus TCP 設備要通訊,顯然是不合適的。

從 MSDN 可以找到 xmlHttpRequest.Timeout 屬性:

http://msdn.microsoft.com/zh-tw/library/cc304105

看起來是 IE 專用的 xmlHttpRequest 才有?(物件名未知),MSXML 3.0 居然沒這屬性,另外測了:MSXML2.XMLHTTP.6.0 也沒這屬性。

查 MSDN 看到可以使用:

ServerXMLHTTP.setTimeouts

http://msdn.microsoft.com/zh-tw/library/ms762278.aspx

在我的 Win7 x64 上可以跑,放在 IE 裡面會有安全對話盒,確認後仍可正常執行,由於我放在 VBScript 內跑,可以不用擔心這個問題。

移到目標電腦後,XPE (Windows XP Embedded) 沒有封裝 IIS ,無法建立 ServerXMLHttp 物件…

回頭在 IE 除錯模式查了 MSXML2.XMLHTTP.6.0 ,有 setTimeouts 方法,但是呼叫會發生錯誤。

最後查得使用 WinHttp.WinHttpRequest.5.1 的 setTimeouts 在 XPE 測沒啥問題,在 IE 內一樣有安全性警告,功能跟 ServerXMLHTTP 差不多,在 Win2k SP3/WinXP SP1 以後就有了~

http://msdn.microsoft.com/zh-tw/library/windows/desktop/aa384086.aspx

所以 VBScript 這部分就這樣用:

   Set htmHttpRequest = CreateXmlHttpRequestObject(False)
   With htmHttpRequest
      .setTimeouts 2000, 2000, 2000, 2000
      .open "POST", strDataUrl, False
      .setRequestHeader "Content-type", "application/x-www-form-urlencoded"
      .send strSend
      strResult = .responseText
   End With

我是設定 nslookup, Connect, send, receive 各 2000 豪秒,實際逾時大概在 2.5 ~ 3.2 秒間,再小的話可能正常的通訊都會失敗,就不再改小了。

Categories: 工作點滴, 技術分享 | Tags: , , , , , | 發表留言

文章導覽

發表迴響

在下方填入你的資料或按右方圖示以社群網站登入:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / 變更 )

Twitter picture

You are commenting using your Twitter account. Log Out / 變更 )

Facebook照片

You are commenting using your Facebook account. Log Out / 變更 )

Google+ photo

You are commenting using your Google+ account. Log Out / 變更 )

連結到 %s

在WordPress.com寫網誌.

%d 位部落客按了讚: