Httpwebrequest

  • Автор темы Rapid Tiger
  • Дата начала
Статус
Закрыто для дальнейших ответов.
R

Rapid Tiger

Гость
#1
Добрый день всем!

Такая проблема:

Есть веб-сервер, который принимает http-запрос в строго регламентированном порядке следования полей (конкретно, eport):

POST
Чтобы видеть этот контент необходимо: Войти или зарегистрироваться
HTTP/1.0
Content-type: text/plain; charset=Windows-1251
Content-length: 73
X-Eport-Auth: point=123456; card="209000-00000"; pin="qwerty"

При попытке посылки запроса HttpWebRequest формирует заголовки в другом порядке:

POST
Чтобы видеть этот контент необходимо: Войти или зарегистрироваться
HTTP/1.0
Content-type: text/plain; charset=Windows-1251
X-Eport-Auth: point=123456; card="209000-00000"; pin="qwerty"
Host: bla-bla-bla ...
Content-length: 73

Сервер доходит до заголовка "X-Eport-Auth: ... " и выдает ошибку "411 "Length Required" Требуется http-заголовок Content-Length".

Как побороть?
 
R

Rapid Tiger

Гость
#3
Господа!

Проблема была не в порядке следования полей, а в отсутствии перевода посылаемого потока в кодировку win-1251.

Тем кому интересно, вот работающий код:

private bool PostData(
string sUrl,
string sSendData,
WebHeaderCollection aSendHeaders,
out string sResult,
out string sErr,
out WebHeaderCollection aReceiveHeaders​
)
{
sResult = "";
aReceiveHeaders = new WebHeaderCollection();
sErr = "";

HttpWebRequest req = null;
HttpWebResponse resp = null;

try
{
req = (HttpWebRequest)WebRequest.Create(sUrl);

// переводим из юникода в win-1251
Encoder coder = System.Text.Encoding.GetEncoding(1251).GetEncoder();
int bytes = -1;
char[] sendChars = sSendData.ToCharArray();
byte[] message = new byte[coder.GetByteCount(sendChars, 0, sendChars.Length, false)];
coder.GetBytes(sendChars, 0, sendChars.Length, message, 0, false);

// формируем формат запроса
req.ProtocolVersion = HttpVersion.Version10;
req.Method = "POST";
req.ContentType = "text/plain; charset=Windows-1251";
req.ContentLength = message.Length;
req.Headers.Add(aSendHeaders);

// посылаем данные на сервер
Stream SendStream = req.GetRequestStream();
SendStream.Write(message, 0, message.Length);
SendStream.Close();

// принимаем данные от сервера и переводим из win-1251 в юникод
resp = (HttpWebResponse) req.GetResponse();
Stream ReceiveStream = resp.GetResponseStream();
StreamReader ReceiveReader = new StreamReader(ReceiveStream, System.Text.Encoding.GetEncoding(1251));
sResult = ReceiveReader.ReadToEnd();

ReceiveReader.Close();
ReceiveStream.Close();

aReceiveHeaders = resp.Headers;

resp.Close();​
}
catch (Exception ex)
{
sErr = ex.Message;
return false;​
}
finally
{
req = null;
resp = null;​
};
return true;​
}
 
Статус
Закрыто для дальнейших ответов.