2012-02-23 3 views
1

Я пытаюсь написать операцию для вызова WebService, проанализировать XML-запрос и вернуть результаты как OutArguement. Я поражен попыткой доступа к CodeActivityContext из OpenReadCompletedEventHandler, который я настроил для анализа XML. Пожалуйста, см. Ниже, что я пытаюсь выполнить, особенно когда я пытаюсь получить доступ к контексту активности (this.OutputType.Set (context, myCollection)) и позвольте мне, можно ли это сделать и как правильно настроить. Большое спасибо за вашу помощь.Workflow Activity для вызова webservice, parse xml response и возвращаемого значения

[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

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

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

 Смежные вопросы

  • Нет связанных вопросов^_^