Httpwebrequest

Тема в разделе ".NET", создана пользователем Rapid Tiger, 15 май 2006.

Статус темы:
Закрыта.
  1. Rapid Tiger

    Rapid Tiger Гость

    Добрый день всем!

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

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

    POST https://dealer.e-port.ru/some_url 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 https://dealer.e-port.ru/some_url 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".

    Как побороть?
     
  2. Dr.Gigabit

    Dr.Gigabit Гость

    Код можно в студию? Спасибо!
     
  3. Rapid Tiger

    Rapid Tiger Гость

    Господа!

    Проблема была не в порядке следования полей, а в отсутствии перевода посылаемого потока в кодировку 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;​
    }
     
Статус темы:
Закрыта.

Поделиться этой страницей