Silverlight HttpWebRequest длина контента пуста, WTF? - PullRequest
1 голос
/ 27 сентября 2010

Когда я запускаю следующий код, веб-служба RESTful, получающая запрос, имеет пустое тело (длина содержимого = 0), и я не знаю почему?

Если я запускаю Fiddler во время отладки, то запрос выполняется так, как ожидалось, и сервер получает тело, я думаю, я не настраиваю что-то для запроса, какие-либо идеи?

        var request = (HttpWebRequest)WebRequest.Create(uri);
        request.ContentType = "text/xml";
        request.Method = "POST";
        request.CookieContainer = new CookieContainer();
        request.CookieContainer.Add(uri, new Cookie("SSOToken", HttpUtility.UrlEncode(SsoToken)));
        request.ContentLength = data.Length;

        request.BeginGetRequestStream(ar1 =>
        {
            var byteArray = Encoding.UTF8.GetBytes(data);

            var stream = request.EndGetRequestStream(ar1);
            stream.Write(byteArray, 0, data.Length);
            stream.Close();

            request.BeginGetResponse(ar2 => HandleSearchCompleted(ar2, request, action), state);
        }, state);

Ответы [ 3 ]

0 голосов
/ 28 сентября 2010

Первое, что нужно сделать, это исправить ошибку в коде.Код предполагает, что общее количество отправляемых байтов будет равно количеству символов в строке data.Это не так, если строка содержит символы вне базового набора символов ASCII.

Сначала вы должны получить байтовый массив UTF8 и использовать длину этого массива как ContentLength и убедиться, что вы отправляете весь массив.

0 голосов
/ 06 января 2011

Вы можете попробовать установить тип содержимого «application / x-www-form-urlencoded» вместо «text / xml», кодировать URL-адрес XML-содержимого и назначить его переменной в теле запроса. Я испытывал такое же поведение при попытке использовать Request.Form на стороне сервера для доступа к данным, пока я не установил тип содержимого правильно. Если вы используете какой-либо другой метод на сервере для получения необработанных данных, то это может не применяться.

0 голосов
/ 28 сентября 2010

Что это за сервер?Если клиент использует протокол HTTP / 1.1 (который используется по умолчанию), он не будет публиковать все тело объекта с запросом.Вместо этого сначала отправляются заголовки с заголовком Expect: 100-continue ...

POST / url HTTP / 1.1

Хост: имя хоста

Содержимое-Длина: 128

Ожидается: 100-продолжить

На этом этапе, если сервер готов принять данные, он должен ответить:

HTTP / 1.1 100 Продолжить

Возможно, вы отправляете сообщение на неисправный сервер, который неправильно понимает запрос.Вот почему, когда вы отправляете сообщение через Fiddler, сервер заканчивает тем, что получает сущность, потому что fiddler, вероятно, отправляет заголовки запроса и тело сущности на сервер (после выполнения HTTP / 1.1 100 продолжайте рукопожатие с клиентом).1020 * Обходные пути?

  1. Попробуйте установить Expect100Continue = false в HttpWebRequest.
  2. Попробуйте использовать протокол HTTP / 1.0.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...