【问题标题】:Call web service methods in specific order按特定顺序调用 Web 服务方法
【发布时间】:2014-06-05 07:55:53
【问题描述】:

我有两个 Web 服务调用,Method1() 和 Method2()。

如果布尔变量设置为 true,则应首先调用 Method1(),然后调用 Method2()。 如果布尔变量设置为 false,则只应调用 Method2()。

当我查看 xml 文件的时间戳时,我可以看到 Method1() 的请求/响应的时间戳比 Method2() 的文件更新,这表明 Method2 在 Method1 之前被调用。

有没有办法在 Method2() 被调用之前等待 Method1() 完成?

    var client = new WebServiceClient();

    bool myBoolean = true;

    if (myBoolean)
    { 
        XmlHandler.ToXML(method1Request, "C:/Temp/method1RQ.xml");
        var method1Response = client.Method1(method1Request);
        XmlHandler.ToXML(method1Response, "C:/Temp/method1RS.xml");
    }

    XmlHandler.ToXML(method2Request, "C:/Temp/method2RQ.xml");
    var method2Response = client.Method2(method2Request);
    XmlHandler.ToXML(method2Response, "C:/Temp/method2RS.xml");

    client.Close();

XmlHandler 中的代码:

public static void ToXML(object obj, string savePath)
{
    if (obj != null)
    {
        try
        {
            if (File.Exists(savePath))
            {
                File.Delete(savePath);
            }
            XmlSerializer serializer = new XmlSerializer(obj.GetType());
            using (XmlTextWriter xmlWriter = new XmlTextWriter(savePath, System.Text.Encoding.UTF8))
            {
                serializer.Serialize(xmlWriter, obj);
                xmlWriter.Close();
            }
        }
        catch (Exception exc)
        {

        }
    }
}

【问题讨论】:

  • 您正在使用同步调用,所以我真的不明白您所描述的情况会如何发生。请出示日志。
  • 没错,我也不明白为什么会这样。我在这里稍微简化了代码,但我所做的是将 xml 写入文件以用于 Method1() 调用的请求/响应和 Method2() 调用的请求/响应。然后当我查看 xml 的时间戳时,我看到 Method1() 的文件时间为 09:30:24,Method2() 的时间为 09:30:23,这表明 Method2() 在 Method1() 之前调用)。
  • @bale3;时间戳不匹配的可能原因。根据 ToXML 实现,如果底层文件流未正确处理/刷新,则无法判断哪个文件最后刷新到文件系统。此外,您可以在客户端和服务器中启动调试器并验证程序执行的顺序。
  • MarkO 上的 +1,我刚刚在我的答案中添加了相同的内容。您可以更改代码以使用文件流显式编写 XML 并在流编写器上调用 Dispose 以便获得定义的行为。
  • 这些是同步调用,因此定义了顺序。但是,从设计的角度来看,您可能希望为每个布尔值创建额外的服务方法,例如 MethodX{Method1(); Method2();}

标签: c# .net web-services


【解决方案1】:

有没有办法在 Method2() 被调用之前等待 Method1() 完成?

这是您正在使用的同步调用的默认行为。

我的最佳猜测是您同时启动了两个服务客户端。

查看服务器日志以了解呼叫何时进入。

也可能是您正在查看本地文件上的时间戳,这些时间戳在程序结束时因完成而被刷新,因此时间/顺序未定义。

我不熟悉 XmlHandler,但无论 XmlHandler 在内部做什么,请确保关闭、刷新和/或处置 StreamWriters。

【讨论】:

  • 我对这两种方法都使用了相同的服务客户端实例。
  • 嗯,然后我会查看服务器日志以查看呼叫何时进入。可能是您正在查看由于最终确定而被刷新的文件上的时间戳程序结束,所以时间不确定。
  • 不幸的是,我无法访问服务器日志,因为它是一个外部 Web 服务,但我认为我正在正确处理流写入器的处理。查看我更新的 OP。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多