代码之家  ›  专栏  ›  技术社区  ›  One Monkey

为什么我的Web服务调用只有在“监视”连接时才起作用?

  •  1
  • One Monkey  · 技术社区  · 16 年前

    好吧,这真是个扫帚匠。

    这在调试中运行良好。

    如果您在Wireshark数据包捕获在发布版本中失败一次后打开它,它将再次正常工作。

    如果在到达请求服务的页面之前启动数据包捕获,那么它会以与正常运行时相同的方式出错。

    对产生正确结果的数据包的捕获显示应用程序发出请求,然后接收它期望的数据。

    该错误的数据包捕获显示应用程序发出请求,然后显式接收“no records returned”错误。

    叹气

    5 回复  |  直到 14 年前
        1
  •  2
  •   Otávio Décio    16 年前

    这可能是web方法本身的问题。查看它如何连接/断开与数据库的连接。看看是否可以在不调用数据库的情况下模拟结果—手动生成结果并调用web服务。还要创建一个直接调用web方法的单元测试,而不使用web服务调用并检查其行为。

        2
  •  1
  •   One Monkey One Monkey    16 年前

    在一个误导的主线中,这个问题的答案由于这里提到的以外的事情而得以解决。尽管如此,还是有很好的建议。

    在这种情况下,我们遇到的问题是我们的系统如何定义完成信用卡收费。该系统应等待授权的成功授权,并将“授权后”的过程视为“成功”。

    确切原因是由于我们产品的不寻常性质和特定银行交易的阶段。对于英国的在线支付,在货物“发货”之前,费用不能“后授权”。

    如果我们出售书籍(或杯子,或新奇的花园侏儒),那么通知成功前Auths将足以考虑交易完成后,航运将稍后发生。我们出售音乐会门票,更确切地说,我们出售的是门票的实物代表的演出入场券。一旦我们拿到客户的钱,他们就可以在所有正常情况下有效地进入演出。

    但是,当预验证成功完成时,客户可以确信它也将发布验证,因此我们此时会向他们显示“完成”屏幕,以使应用程序运行得更快。在要求售票的票房上,这是一样的。然而,没有人知道的是,post-auth可能需要更多的一分钟到三分钟来进行post-auth,因此是一个完全的“成功”。如果收费不成功,它将不会从打印服务返回,因为底层DB查询返回其“no orders match”结果,所以我最后要做的就是等待它完成后期授权,并且工作正常。

    总而言之,这是一个茶杯里的暴风雨。现在,我们只需要底层SQL在成功页面的同时返回订单,但不包括失败的费用(例如可能由于键入欺诈检测字段(如持卡人邮政编码)以及要打印详细信息的成功费用。

        3
  •  0
  •   Darryl Braaten    16 年前

        4
  •  0
  •   One Monkey One Monkey    16 年前

    更新:我从OWasp开始通过WebScarab进行监控,在一个“失败”的请求之后,我使用应用程序手动请求插件复制原始请求并通过Scarab直接发送。

    因此winforms应用程序发送的内容是有效的。Web服务请求中是否缺少某些通信设置?

        5
  •  0
  •   Brad Bruce    16 年前

    namespace [NameSpaceHere]
    {
        public partial class [the name of the proxy class created by Visual Studio]
        {
            protected override System.Net.WebRequest GetWebRequest(Uri uri)
            {
                System.Net.HttpWebRequest webRequest = (System.Net.HttpWebRequest)base.GetWebRequest(uri);
    
                // turning this off can cause authentication errors
                //            webRequest.KeepAlive = false;
    
                webRequest.ProtocolVersion = HttpVersion.Version10;
                webRequest.ServicePoint.Expect100Continue = false;
                return webRequest;
            }
        }
    }