调用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
{
}
}
请阅读WF4中的AsyncCodeActivity。这将允许您从活动中调用APM(异步编程模型,即Beginxxx、Endxxx)方法对,而不会阻塞调度程序线程。
WebClient类使用EAP(事件异步编程)模型,因此没有方法对。您可以在包装的TPL任务中使用BeginInvoke-EndInvoke对,也可以使用HttpWebRequest而不是WebClient。