调用webservice、解析xml响应并返回值的工作流活动

本文关键字:返回值 工作流 活动 响应 webservice 解析 xml 调用 | 更新日期: 2023-09-27 18:25:38

我正试图编写一个活动来调用WebService,解析xml响应,并将结果作为OutArgument返回。我在尝试从我为解析xml而设置的OpenReadCompletedEventHandler访问CodeActivityContext时感到震惊。请参阅下面的内容,了解我试图实现的目标,特别是我试图访问活动上下文(this.OutputType.Set(context,myCollection))的位置,并告诉我是否可以做到这一点以及如何正确设置。非常感谢你的帮助。

[CategoryAttribute("Out Arguments")]
        public OutArgument<List<string>> OutputType { get; set; }

protected override void Execute(CodeActivityContext context)
            {
                Uri svcUri = new Uri(@"http://path/to/webservice");
                WebClient svc = new WebClient();
                svc.OpenReadCompleted += new OpenReadCompletedEventHandler(svc_OpenReadCompleted);
                svc.OpenReadAsync(svcUri);
            }

void svc_OpenReadCompleted(object sender, OpenReadCompletedEventArgs e)
        {
            if (e.Error == null)
            {
                Stream responseStream = e.Result;
                parametersXml = XDocument.Load(responseStream);
                // linq to xml to pull out each of the parameter tags and their descendants
                var parameters = from item in parametersXml.Descendants("parameter")
                                 select new myParameter
                                 {
                                     name = item.Element("name").Value,
                                     description = item.Element("description").Value,
                                     defaultValue = item.Element("defaultValue").Value,
                                     optionsType = item.Element("optionsType").Value,
                                     type = item.Element("type").Value,
                                     options = (from ops in item.Descendants("options").Elements()
                                                select new
                                                {
                                                    Key = (string)ops.Element("value").Value,
                                                    Value = ops.Element("displayAlias") != null
                                                    ? (string)ops.Element("displayAlias").Value
                                                    : ""
                                                }).ToDictionary(pair => pair.Key, pair => pair.Value)
                                 };
                foreach (myParameter i in parameters)
                {
                    if (i.name == "DATA_TO_DOWNLOAD")
                    {
                        foreach (string optionKey in i.options.Keys)
                        {
                            myCollection.Add(optionKey);
                        }
                    }
                    this.OutputType.Set(context, myCollection);
                }
            }
            else
            {
            }
        }

调用webservice、解析xml响应并返回值的工作流活动

请阅读WF4中的AsyncCodeActivity。这将允许您从活动中调用APM(异步编程模型,即Beginxxx、Endxxx)方法对,而不会阻塞调度程序线程。

WebClient类使用EAP(事件异步编程)模型,因此没有方法对。您可以在包装的TPL任务中使用BeginInvoke-EndInvoke对,也可以使用HttpWebRequest而不是WebClient。