【问题标题】:cURL in .NET application.NET 应用程序中的 cURL
【发布时间】:2017-10-04 19:53:48
【问题描述】:

我有一个 WooCommerce 提供的 cURL 命令:

curl https://example.com/wp-json/wc/v2/orders \
-u consumer_key:consumer_secret

我正在使用 WebClient:

using (WebClient wc = new WebClient())
{
    Uri url = new Uri("https://www.myhost.com/wp-json/wc/v2/orders");
    System.Collections.Specialized.NameValueCollection reqparm = new System.Collections.Specialized.NameValueCollection();
    reqparm.Add("consumer_key", keyValue);

    byte[] responsebytes = wc.UploadValues(url, "POST", reqparm);
    string responsebody = Encoding.UTF8.GetString(responsebytes);
}

但是我收到了这个错误:

IOException:无法从传输连接读取数据:现有连接被远程主机强行关闭。

我在这里做错了什么?我很确定我的网址和密钥是正确的。

编辑:刚刚按照 CmdrTchort 和 David 的建议尝试过这个:

using (WebClient wc = new WebClient())
{
    wc.UseDefaultCredentials = true;
    wc.Credentials = new NetworkCredential("consumer_key", keyValue);                
    string responsebody = wc.DownloadString("https://www.myhost.com/wp-json/wc/v2/orders");
}

仍然收到同样的错误。

编辑:我怀疑我收到了无效的凭据,一旦清楚,我将更新...

我获得了错误的凭据。然而这并没有解决问题。

我不明白consumer_key:consumer_secret 应该如何在此请求中表示。有两个值:consumer_key 和 consumer_secret(我之前只提供了 consumer_secret,我把它放在了 keyValue 所在的位置)。我现在假设它应该是以下形式:

wc.Credentials = new NetworkCredential("consumer_key", "consumer_secret");

其中“consumer_key”和“consumer_secret”表示提供的唯一值。这不起作用。这开始有点烦人了。

【问题讨论】:

  • 由于错误信息,看起来像是处理证书或 SSL/TLS 版本问题或不匹配
  • 您提到您有他们提供的 cURL 命令,但是您是否从您尝试通过 WebClient 访问的工作站对其进行了测试?它可能有助于更好地隔离问题,以了解 cURL 是否发生相同的问题,并指导您是否应该查看自己的代码或您与 Web 服务之间的其他内容。

标签: c# curl webclient


【解决方案1】:

您将consumer_key:consumer_secret 作为 POST 表单的一部分发布,但这不是 cURL 所做的。这看起来更像是带有提供身份验证的 GET 请求。也许是这样的:

wc.Credentials = new NetworkCredential("consumer_key", "consumer_secret");

然后发出 GET 请求而不是 POST。如果没有要上传的值,那部分可能会被简化。可能是这样的:

string responsebody = wc.DownloadString(url);

【讨论】:

  • 谢谢,但仍然收到相同的错误(请参阅编辑后的帖子)
  • @Dom:你确认cURL命令本身成功了吗?如果没有任何效果,那么您可能需要与供应商核实。
【解决方案2】:

-u 在 curl 中将凭据作为授权标头而不是作为参数字典传递。

您可以添加您的凭据:

wc.UseDefaultCredentials = true; 
wc.Credentials = new NetworkCredential("username", "password");

您的服务是否响应和/或它是不受信任的或自签名的证书? 如果是这样,您可以测试忽略 SSL 警告。

顺便说一句,curl 默认使用 get (-X 指定方法,我在您的示例中看不到) - 所以我假设您默认情况下只接收而不实际发布值?如果是这样,您可以直接使用 DownloadString()。

所以,如果你想从这个 url 获取文件,你可以这样做:

// IGNORE ALL SSL Certificates - would not do this in production
ServicePointManager.ServerCertificateValidationCallback =
       new RemoteCertificateValidationCallback(
            delegate
            { return true; }
        );

using (WebClient wc = new WebClient())
{
 wc.UseDefaultCredentials = true; 
 wc.Credentials = new NetworkCredential("consumer_key", keyValue);
 string responsebody = wc.DownloadString("https://www.myhost.com/wp-json/wc/v2/orders");
}

【讨论】:

  • 已经尝试过您的示例(是 GET 请求,我的错误),但仍然遇到同样的错误。
  • 您的 SSL 证书有问题吗?在这种情况下测试上述方法。如果没有 - 您应该在从浏览器或类似设备请求时检查您的服务/订单是否仍在工作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-10
  • 1970-01-01
  • 2017-04-21
  • 2010-12-02
  • 2012-05-17
  • 2019-09-08
相关资源
最近更新 更多