2017-10-12 4 views
0

私は私の会社の独自のシステムを通じてデータをジオコードするように設計されたssisパッケージにc#スクリプトタスクを持っています。c#API呼び出しで変数を送信して返しますか?

1)アドレスのクエリを引き出し、データテーブル に入れます。2)そのテーブルとForeach行をループし、ビルドリクエストを送信し、リクエストを送信し、レスポンスを待ってからデータベースに挿入し直します。

外出してapi側で新しいアドレスを取得する前に、現在のデータベース(文字列一致)をチェックしてアドレスがまだ存在しないことを確認するため、各呼び出しが永遠に戻ります。存在しない場合は、googleなどのサービスから新しいデータを取得してください。

私は一度に一つをやっているので、それは私がデータベースに挿入するために戻ったときにレコードにIDフィールドを維持することが容易になります。

が今手元に問題が来る...私は、マルチスレッドまたは非同期としてこれを設定するように言われました。ここで私はこのトピックについてはこちらで読んでいたページには、次のとおりです。 ASP.NET Multithreading Web Requests

var urls = new List<string>(); 

    var results = new ConcurrentBag<OccupationSearch>(); 

    Parallel.ForEach(urls, url => 
    { 
     WebRequest request = WebRequest.Create(requestUrl); 

     string response = new StreamReader(request.GetResponse().GetResponseStream()).ReadToEnd(); 

     var result = JsonSerializer().Deserialize<OccupationSearch>(new JsonTextReader(new StringReader(response))); 

     results.Add(result); 
    }); 

多分、私はこの間違ったを考えるんだけど、私は2つの要求(& B)を送信し、Bは、実際には最初返す言うことができます場合にはデータベースを更新するために戻ったときに、正しいレコードを更新していることを確認するにはどうすればよいですか? API呼び出しでIDを送信して返すことはできますか?

私の考えは、私は私のINSERT文のループを通過、その後することを、要求の配列を作成し、応答を待たずにそれらを介して燃焼し、別の配列にそれらの値を返すようにしています。

これは良い方法ですか?私はParrallel.ForEachを一度も使用していません。私がそれで見つけたすべての情報は、自分の状況を視覚化して適用するにはあまりにも技術的です。

+0

ワンダーあなたは 'WebRequest'とNOT' HttpClient' –

+0

を使用している理由は、このコードのように見えるが二回まったく同じ要求を送信します。だから、A&Bが同じレスポンスであればどんな順序でA&Bが返されるか気にする。どんなボディも実際にこのコードをテストしましたか?あなたはリストのURLを持っていますが、それはForEachで使われることはありません。では、このコードは実際にどのようなメッセージを送信しますか? – jdweng

答えて

0

おそらく、私はこの間違ったことを考えているが、私は2つの要求(& B)を送信し、Bは、実際には最初返す言うことができます場合、どのように私は私のデータベースを更新するために戻ったときに私がいることを保証することができます正しいレコードを更新しますか? API呼び出しでIDを送信して返すことはできますか?

あなたのコードには「ID」のようなものは含まれていませんが、必要なものはすべてURLにあるものとします。そのような場合は、Bagの代わりにDictionaryを使用するという簡単な答えがあります。このコードが実行された後

List<string> urls = GetListOfUrlsFromSomewhere(); 

    var results = new ConcurrentDictionary<string, OccupationSearch>(); 

    Parallel.ForEach(urls.Distinct(), url => 
    { 
     WebRequest request = WebRequest.Create(url); 

     string response = new StreamReader(request.GetResponse().GetResponseStream()).ReadToEnd(); 

     var result = JsonSerializer().Deserialize<OccupationSearch>(new JsonTextReader(new StringReader(response))); 

     results.TryAdd(url, result); 
    }); 

results辞書には、元のURLに各応答を関連付けるエントリが含まれます。

注:HttpClientを代わりにWebクライアントを使用する場合があります、そして、あなたの使い捨てのオブジェクトを処分するために世話をする必要があり、例えばStreamReaderおよびStringReader。あなたが二回まったく同じ答えを得る必要がありますので

+0

これは私のコードではなく、これはリンクからのものです。私は実際にHTTPClientを使用します。また、最も簡単な解決策は、私のForeachループをParallel.Foreachループに変換することだけであることに気付きました。そうすればIDなどについては問題にならないでしょう... – user3486773

関連する問題