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