.NET应用程序中的cURL

时间:2017-10-04 10:20:41

标签: c# curl webclient

我有一个由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"代表提供的唯一值。这不起作用。这开始变得有点刺激。

2 个答案:

答案 0 :(得分:0)

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

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

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

string responsebody = wc.DownloadString(url);

答案 1 :(得分:0)

curl中的

-u将凭证作为授权标题传递,而不是作为参数字典。

您可以使用以下内容添加凭据:

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

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

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

因此,如果您尝试从此网址获取文件,则可以执行以下操作:

// 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");
}