【问题标题】:Random invalid procedure call or argument in vbscript using a COM使用 COM 的 vbscript 中的随机无效过程调用或参数
【发布时间】:2016-10-11 05:04:51
【问题描述】:

当我尝试访问我的经典 ASP 应用程序时,我收到“无效的过程调用或参数”的随机错误。导致此错误的行调用了 C# 组件中的方法。

这是在 vbscript 中中断的行:

tmpArray2 = session.get(arrName) 'where arrName is a string

这种线也会裂开:

if UBound(session.get("RTT_ID")) <> "-1" then

这里是get方法的组件代码:

 public object get(string key)
    {
        if (key == null || IsExpired)
        {
            return null;
        }

        if (!SessionData.ContainsKey(key))
        {
            var sessionData = GetDbSessionData(key);

            var cachedValue = default(object);
            if (sessionData == null || sessionData.Value == null || sessionData.ValueType == null)
            {
                LogManager.Instance.LogFormat(this, LogLevel.Warning, "Session data not found. SessionId: '{0}'; Key: '{1}'.", this.SessionInfo.Id, key);
                cachedValue = null;
            }
            else
            {
                cachedValue = SessionDataSerializer.Instance.DeserializeSessionData(sessionData.Value, sessionData.ValueType);
            }

            var cachedSessionData = new CachedSessionData();
            cachedSessionData.CachedValue = cachedValue;
            cachedSessionData.DbEntity = sessionData;

            SessionData.Add(key, cachedSessionData);
        }

        RefreshExpirationDate();

        return SessionData[key].CachedValue;
    }

另外,我注意到并且我不知道它是否相关,这段代码在有 2 台服务器的环境中破解了很多,并在第一个服务器太忙时在它们之间进行了平衡。如果我在单个服务器上尝试它,我只成功地破坏了一次。

有什么想法吗?

【问题讨论】:

  • 您的 vbscript 代码正在寻找一个 Variant 并且您正在返回一个字符串的值...(即 get(string key))
  • @SteveKline 谢谢你的回答。我应该如何更改代码以使其正常工作?问题是有时该调用有效,而另一些则返回该错误。
  • 不工作的时候有可能,因为返回没有数据,所以报错。您可以启用“On Error Resume Next”并使用“if err.number 0 Then.... err.clear... Error handle stuff here。然后在 if/end if 语句之后处理错误。On Error继续下一步。
  • @SteveKline 如果问题是没有返回数据,那么只要确保你有一个字符串tmpArray2 = session.get(arrName) &amp; ""If UBound(session.get("RTT_ID") &amp; "") &lt;&gt; "-1" Then,不需要On Error Resume Next 那是事情变得混乱的时候,尤其是如果你不这样做' t 再次使用On Error Goto 0 将其关闭。我会先将session.get() 的值放在一个局部变量中,然后再尝试将其传递给UBound() 之类的函数,这样您就可以先评估结果。
  • 这就是我的意思,当没有从这些数据或数组返回时它会出错......您必须在脚本中构建错误处理或按原样接受它。

标签: c# vbscript com


【解决方案1】:

感谢您的回答。问题在于,因为我们想提高性能,我们必须序列化发送到组件的每个对象,并在将其返回到 vbscript 时对其进行反序列化。问题是我们有一个包含其他数组的数组,当我们反序列化该数组时,我们也无法返回子数组,这就是问题所在。我们使用 MessageBox 库进行反序列化。

另外要提到的是,在我们的环境中,我们有 2 台服务器,我们正在它们之间做一些平衡。当应用程序仅在一台服务器上运行时,反序列化是好的,我们没有问题,但是当我们切换到另一台服务器时,我们遇到了这个问题。

也许这个答案会帮助其他人了解如果您收到此类错误会发生什么。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多