Мне нужно сделать HTTP POST с помощью С#. Он должен сделать обратную передачу так же, как и страницу IE6.
Из документации обратная передача должна выглядеть как
POST /.../Upload.asp?b_customerId=[O/M1234] HTTP/1.1
Content-length: 12345
Content-type: multipart/form-data; boundary=vxvxv
Host: www.foo.com
--vxvxv
Content-disposition: form-data; name="File1"; filename="noColonsSpacesOrAmpersandsInHere"
Content-type: text/xml
<?xml version="1.0" encoding="UTF-8"?>
...
<bat:Batch ...
.......
</bat:Batch>
--vxvxv--
Я думаю, что у меня проблемы с граничными символами. Я попытался установить границу в данных сообщения, а скрипач показывает что-то подобное, но я возвращаю страницу с ошибкой "Invalid procedure call or argument". Content-disposition находится в теле, а не в заголовке, чтобы держать его в пределах границ. Я не уверен, что это правильно. Правильно ли я устанавливаю границу? Может ли кто-нибудь дать некоторые рекомендации о том, как сделать HTTP POST в стиле IE6 с помощью С#? Спасибо
Мой код
data = "--vxvxv" + Environment.NewLine +
"Content-disposition: form-data; name=\"File1\";" + Environment.NewLine +
"filename=\"provideTest.xml\"" + Environment.NewLine +
"Content-type: text/xml" + Environment.NewLine +
@"<?xml version=""1.0"" encoding=""UTF-8""?>" + Environment.NewLine +
data + Environment.NewLine +
"--vxvxv--";
var encoding = ASCIIEncoding.UTF8;
HttpWebRequest request;
var postData = encoding.GetBytes(data);
request = (HttpWebRequest)WebRequest.Create(url);
request.ContentLength = postData.Length;
request.Method = "POST";
request.ContentType = "multipart/form-data; boundary=vxvxv";
request.Host = "www.foo.com";
request.ContentLength = postData.Length;
X509Certificate2Collection certCollect = new X509Certificate2Collection();
X509Certificate2 cert = new X509Certificate2(@"C:\a\cert.pfx", "password");
certCollect.Add(cert);
request.ClientCertificates = certCollect;
using (Stream writeStream = request.GetRequestStream()) {
writeStream.Write(postData, 0, postData.Length); }
WebResponse webResponse = request.GetResponse();
string output = new StreamReader(webResponse.GetResponseStream()).ReadToEnd();
LogEntry.Write("Recieved : " + output);
return output;
Выход Fiddler (raw)
POST https://../Upload.asp?b_customerId=%5BO/M1234%5D HTTP/1.1
Content-Type: multipart/form-data; boundary=vxvxv
Host: www.foo.com
Content-Length: 5500
Expect: 100-continue
Connection: Keep-Alive
--vxvxv
Content-disposition: form-data; name="File1";
filename="provideTest.xml"
Content-type: text/xml
<?xml version="1.0" encoding="UTF-8"?>
...SNIP...
</bat:Batch>
--vxvxv--