【问题标题】:Send and return variable with c# API call?使用 c# API 调用发送和返回变量?
【发布时间】:2017-10-12 22:51:25
【问题描述】:

我在 ssis 包中有一个 c# 脚本任务,旨在通过我公司的专有系统对数据进行地理编码。它目前的工作方式如下:

1) 拉取地址查询并放入数据表 2) 遍历该表和 Foreach 行,构建请求,发送请求,等待响应,然后插入回数据库。

问题是每次调用都需要永远返回,因为在 api 端获取新地址之前,它会检查当前数据库(字符串匹配)以确保该地址不存在。如果不存在,那就出去从谷歌之类的服务中获取新数据。

因为我一次只做一个,所以当我回去插入数据库时​​,很容易将 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 个请求(A 和 B)并假设 B 实际上首先返回,我如何确保当我回去更新我的数据库时我正在更新正确的记录?我可以通过 API 调用发送 ID 并返回吗?

我的想法是创建一个请求数组,在不等待响应的情况下处理它们并将这些值返回到另一个数组中,然后我将在我的插入语句中循环。

这是解决这个问题的好方法吗?我从未使用过 Parrallel.ForEach,而且我在其中找到的所有信息都过于技术化,无法想象并适用于我的情况。

【问题讨论】:

  • 想知道你为什么使用WebRequest而不是HttpClient
  • 看起来这段代码两次发送完全相同的请求,所以你应该两次得到完全相同的答案。所以谁在乎如果它是相同的响应返回什么订单 A 和 B。有没有人实际测试过这段代码?您有一个列表 url,但它从未在 ForEach 中使用。那么这段代码实际发送了什么消息。

标签: c# asynchronous httpwebrequest httpwebresponse


【解决方案1】:

也许我在想这个错误,但是如果我发送 2 个请求(A 和 B)并假设 B 实际上首先返回,我如何确保当我回去更新我的数据库时我正在更新正确的记录?我可以通过 API 调用发送 ID 并返回吗?

您的任何代码都不包含任何看起来像“ID”的内容,但我假设您需要的所有内容都在 URL 中。如果是这种情况,一个简单的答案是使用 Dictionary 而不是 Bag。

    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 而不是 WebClient,并且您应该小心处理一次性对象,例如StreamReader 和 StringReader。

【讨论】:

  • 这不是我的代码,这是来自链接。我实际上确实使用 HTTPClient。我还意识到最简单的解决方案就是将我的 Foreach 循环转换为 Parallel.Foreach 循环。这样,ID等就无关紧要了...
猜你喜欢
  • 2015-12-08
  • 2015-10-28
  • 1970-01-01
  • 2016-08-24
  • 1970-01-01
  • 1970-01-01
  • 2022-01-23
  • 2013-09-03
  • 2011-03-01
相关资源
最近更新 更多