Активность рабочего процесса для вызова веб-службы, анализа XML-ответа и возврата значения - PullRequest
1 голос
/ 23 февраля 2012

Я пытаюсь написать действие для вызова WebService, разобрать ответ xml и вернуть результаты как OutArguement.Я поражен, пытаясь получить доступ к CodeActivityContext из OpenReadCompletedEventHandler, который я настроил для анализа xml.Ниже приведено описание того, что я пытаюсь выполнить, в частности, где я пытаюсь получить доступ к контексту активности (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
            {
            }
        }

1 Ответ

1 голос
/ 24 февраля 2012

Пожалуйста, ознакомьтесь с AsyncCodeActivity в WF4.Это позволит вам вызывать пару методов APM (модель асинхронного программирования, т.е. Beginxxx, Endxxx) из действия без блокировки потока планировщика.

Класс WebClient использует модель EAP (Event Asynchonous Programming), поэтому не делаетесть пара методов.Вы можете использовать либо пару BeginInvoke EndInvoke в обернутой задаче TPL , либо использовать HttpWebRequest вместо WebClient.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...