使用WebClient使用htaccess向apache服务器发送POST请求


Send POST request to apache server with htaccess using WebClient

我在使用WebClient使用htaccess向apache服务器发送POST请求时遇到了问题(我曾尝试使用HttpRequest和WebRequest,但结果相同)。我从PHP上的供应商那里得到了以下例子:

$soap = curl_init(url);
curl_setopt($soap, CURLOPT_POST, 1);
curl_setopt($soap, CURLOPT_RETURNTRANSFER, 1);
$XML = file_get_contents("test.xml");
$request = <<<XML
$XML
XML;
curl_setopt($soap, CURLOPT_HTTPHEADER, array('Content-Type: text/xml; charset=utf-8', 'Content-Length: '.strlen($request)));
curl_setopt($soap, CURLOPT_POSTFIELDS, $request);
$response = curl_exec($soap);
curl_close($soap);

我在C#上的版本是:

public static string Post(string login, string password, string url, string content) {
    var result = String.Empty;
    var uri = new Uri(url);
    using (var client = new WebClient()) {
        client.Credentials = new NetworkCredential(login, password);
        client.Encoding = Encoding.UTF8;
        client.Headers[HttpRequestHeader.ContentType] = "text/xml; charset=UTF-8";
        client.Headers[HttpRequestHeader.Accept] = "application/xml";
        result = client.UploadString(uri, content);
    }
    return result;
}

当我运行程序时,我遇到了一个异常,错误为400(错误请求)。我已经使用Fiddler2探查了该请求,并发现以下错误消息:"请求标头字段缺少':'分隔符"有人能帮我找到请求中的错误以及服务器拒绝请求的原因吗

p.S:请求头

POST http://production.is.topdelivery.ru/tests/xmlGate/index.php HTTP/1.1
Content-Type: text/xml; charset=utf-8
Authorization: Basic YmFiYWR1OmJhYmFkdXBhc3M=
Host: production.is.topdelivery.ru
Content-Length: 1617
Expect: 100-continue

在我的情况下,以下代码正常工作

private string post(string content)
{
    var result = String.Empty;
    var uri = new Uri(_url);
    WebRequest req = HttpWebRequest.Create(uri);
    req.Method = "POST";
    req.ContentType = "text/xml";
    String encoded = Convert.ToBase64String(System.Text.Encoding.UTF8.GetBytes("user:pass"));
    req.Headers.Add("Authorization", "Basic " + encoded);
    using (var s = req.GetRequestStream())
    using (var sw = new StreamWriter(s, Encoding.UTF8))
    {
        sw.Write(content);
    }
    using (var s = req.GetResponse().GetResponseStream())
    using (var sr = new StreamReader(s, Encoding.UTF8))
    {
        result = sr.ReadToEnd();
    };
    return result;
}

这对我很有帮助。我遇到了一个问题,一个新版本的Apache看不到凭据,尽管旧版本没有问题。我更改了

client.Credentials = new NetworkCredential(login, password);

String encoded = Convert.ToBase64String(System.Text.Encoding.UTF8.GetBytes("user:pass"));
    req.Headers.Add("Authorization", "Basic " + encoded);

它成功了!

谢谢。