2012-02-23 6 views
1

WebServiceを呼び出し、XML応答を解析して結果をOutArguementとして返すアクティビティを作成しようとしています。私はxmlを解析するように設定したOpenReadCompletedEventHandlerからCodeActivityContextにアクセスしようとしています。私が達成しようとしていること、具体的には私がアクティビティコンテキスト(this.OutputType.Set(context、myCollection))にアクセスしようとしているところを見て、これができるかどうか、正しく設定する方法を教えてください。ご協力いただき誠にありがとうございます。webserviceを呼び出し、xml応答を解析して戻り値を返すワークフローアクティビティ

[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

WF4のAsyncCodeActivityでお読みください。これにより、スケジューラースレッドをブロックせずに、アクティビティーからAPM(非同期プログラミングモデル、つまりBeginxxx、Endxxx)メソッドのペアを呼び出すことができます。

WebClientクラスはEAP(Event Asynchonous Programming)モデルを使用しているため、メソッドペアはありません。 wrapped TPL TaskでBeginInvoke EndInvokeペアを使用するか、WebClientではなくHttpWebRequestを使用します。

関連する問題