HttpWebRequest получает поток даже без подключения к интернету - PullRequest
0 голосов
/ 13 апреля 2011

Я использую приведенный ниже код для отправки байтового массива на сайт.Почему этот код не генерирует исключение, даже когда нет подключения к Интернету?. Даже когда нет соединения, я могу получить поток и записать в него.любая идея, почему он ведет себя так.

     private void UploadHttpFile()
    {
        HttpWebRequest request = WebRequest.CreateHttp(new Uri(myUrl));
        request.ContentType = string.Format("multipart/form-data; boundary={0}", boundary);


        request.UserAgent = "Mozilla/4.0 (Windows; U; Windows Vista;)";

        request.Method = "POST";
        request.UseDefaultCredentials = true;

        request.BeginGetRequestStream(GetStream, request);


    }

    private void GetStream(IAsyncResult result)
    {
        try
        {
            HttpWebRequest request1 = (HttpWebRequest)result.AsyncState;
            using (Stream postStream = request1.EndGetRequestStream(result))
            {
                int len = postBody.Length;
                len += mainBody.Length;
                len += endBody.Length;
                byte[] postArray = new byte[len + 1];
                Encoding.UTF8.GetBytes(postBody.ToString()).CopyTo(postArray, 0);
                Encoding.UTF8.GetBytes(mainBody).CopyTo(postArray, postBody.Length);
                Encoding.UTF8.GetBytes(endBody).CopyTo(postArray, postBody.Length + mainBody.Length);
                postStream.Write(postArray, 0, postArray.Length);
            }
        }

1 Ответ

2 голосов
/ 13 апреля 2011

Я ожидаю, что он буферизует все, пока вы не закончите писать, после чего он сможет сразу использовать длину контента. Если вы установите:

request.AllowWriteStreamBuffering = false;

тогда я подозреваю, что он потерпит неудачу, по крайней мере, при записи в поток.

Кстати, ваше вычисление требуемой длины для postArray, похоже, предполагает один байт на символ, что не всегда будет так ... и вы звоните ToString на postBody, что выглядит как избыточный. В любом случае, я не уверен, почему вы пытаетесь записать один вызов ... либо вы можете позвонить три раза:

byte[] postBodyBytes = Encoding.UTF8.GetBytes(postBody);
postStream.Write(postBodyBytes, 0, postBodyBytes.Length);
// etc

или (предпочтительно) просто используйте StreamWriter:

using (Stream postStream = request1.EndGetRequestStream(result))
{
    using (StreamWriter writer = new StreamWriter(postStream)
    {
        writer.Write(postBody);
        writer.Write(mainBody);
        writer.Write(endBody);
    }
}

Это также неясно, почему вы добавили 1 к необходимой длине при инициализации postArray. Вы пытаетесь отправить дополнительный "0" байт в конце данных?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...