为什么我的Web服务调用仅在您“观察”连接时才起作用?

时间:2009-01-28 16:04:16

标签: web-services networking

好的,这是一个真正的头脑。

我有一个调用Web服务的应用程序。它是一个有效的Web服务,它从SQL服务器db中提取一些数据,将其打包成XML文档并将其返回到Winforms应用程序进行处理。

这在调试中工作正常。

当你正常运行它时会失败,但它会返回特定的数据,这些数据应该表示没有从具有特定ID的数据库返回的有效记录。

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

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

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

错误显示应用​​程序发出请求的数据包捕获然后显式接收“无记录返回”错误。

我们注意到的一件事是,当它工作时需要大约0.25 / 0.5秒的工作,但是当它不起作用时它的响应速度要快得多。

编辑:好的,我知道我忘记了什么。最初,我确信这是服务本身。或者SQL。所以我测试了SQL,没有问题。我在本地调试了这个服务。没有任何问题。我构建了一个测试工具,用于从我的浏览器向服务提供数据,并将reult捕获到标签。我给它喂了一些数据。很好。这不是服务。服务还可以。显然,当通过我的Winforms应用程序调用时,数据包捕获确认正在发送正确的数据。然后它只在某些条件下失败。 叹息

有谁知道为什么会这样?

5 个答案:

答案 0 :(得分:2)

这可能是您的网络方法本身的问题。了解它如何连接/断开与数据库的连接。看看你是否可以在不调用数据库的情况下模拟结果 - 手动构建结果并调用Web服务。还可以创建一个单独的测试,直接调用您的Web方法,而无需使用Web服务调用并检查其行为。

答案 1 :(得分:1)

在误导的主线上,由于除了这里提到的东西之外的其他东西,这个问题的答案得到了解决。尽管如此仍有很好的建议。

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

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

如果我们出售书籍(或马克杯或新奇花园侏儒),那么通知成功的Pre Auth将足以考虑交易完成,因为运输将在稍后发生。我们出售音乐会门票,更准确地说,我们出售门票,其实际代表是门票。在我们获得客户资金的那一刻,他们有效地保证了他们在所有正常情况下进入演出。

在实际意义上,我们的产品在第二个交易完成后发货,因此需要完成预认证和后认证过程以将交易计为“成功”。

然而,当预验证成功完成时,客户可以确保它也会发布auth,因此我们此时会向他们展示“完整”屏幕,以使应用程序运行得更快。在要求打印票的票房上这是一样的。然而,没有人知道的是,后验证可能需要一分钟到三分钟来发布auth,因此是一个完整的“成功”。如果收费不成功,它将不会从打印服务返回,因为基础数据库查询返回其“无订单匹配”结果,所以我所要做的就是等到它完成后authing并且它运作良好。

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

感谢大家的帮助。对不起,这是一个相对平凡的修复。

答案 2 :(得分:0)

仔细检查您的winforms应用程序是否未被FW阻止。

答案 3 :(得分:0)

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

这个“失败”的工作然后完美地工作了几次。

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

答案 4 :(得分:0)

我过去遇到过类似的问题。我最终必须包装GetWebRequest方法并调整参数。

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;
        }
    }
}