HttpWebRequest работает. WebClient.UploadFile не

Я думал, что нашел способ упростить мой кодusing WebClient.UploadFile instead of HttpWebRequest, но я получаю файл на стороне сервера, который на несколько десятков байт слишком короткий и поврежден. Есть идеи, где лежит ошибка?

Спасибо

Using HttpWebRequest (works fine):

       HttpWebRequest req = (HttpWebRequest)HttpWebRequest
                                 .Create("http://" +
                                  ConnectionManager.FileServerAddress + ":" +
                                  ConnectionManager.FileServerPort +
                                  "/binary/up/" + category + "/" +  
                                  Path.GetFileName(filename) + "/" + safehash);

        req.Method = "POST";
        req.ContentType = "binary/octet-stream";
        req.AllowWriteStreamBuffering = false;
        req.ContentLength = bytes.Length;
        Stream reqStream = req.GetRequestStream();

        int offset = 0;
        while (offset < ____)
        {
            reqStream.Write(bytes, offset, _________);
             _______
             _______
             _______

        }
        reqStream.Close();

        try
        {
            HttpWebResponse resp = (HttpWebResponse) req.GetResponse();
        }
        catch (Exception e)
        {
            _____________
        }
        return safehash;

Using WebClient (corrupt file on server end):

      var client = new WebClient();
      client.Encoding = Encoding.UTF8;
      client.Headers.Add(HttpRequestHeader.ContentType, "binary/octet-stream");

      client.UploadFile(new Uri("http://" +
              ConnectionManager.FileServerAddress + ":" +
              ConnectionManager.FileServerPort +
              "/binary/up/" + category + "/" +
              Path.GetFileName(filename) + "/" + safehash), filename);

      return safehash;

Серверная сторона - это сервис WCF:

  [OperationContract]
    [WebInvoke(Method = "POST", UriTemplate = "up/file/{fileName}/{hash}")]

    void FileUpload(string fileName, string hash, Stream fileStream);
 Cᴏʀʏ17 мая 2012 г., 22:01
Если ваша цель - сервис WCF, есть ли причина, по которой вы его не используетека сервис, и вместо этого пытаться вручную отправить данные на него? Какие размеры файлов мы говорим о загрузке здесь? WCF имеет довольно небольшие ограничения по умолчанию для размера файла. У вас возникли проблемы с поддержанием активности или таймаутом сWebClient реализация? Получаете ли вы какие-либо исключения с вашей стороны?
 carlosfigueira17 мая 2012 г., 22:14
Если вы посмотрите на запрос в таком инструменте, как Fiddler, показывает ли он разницу между ними?
 Harry Mexican17 мая 2012 г., 22:26
Fiddler .. хмммм хорошая идея. Я сейчас проверю. Кори: никаких проблем с обеих сторон, просто поврежденный файл.

Ответы на вопрос(1)

Решение Вопроса

WebClient.UploadFile отправляет данные в формате multipart / form-data. То, что вы хотите использовать, чтобы иметь эквивалент кода, использующего HttpWebRequest, этоWebClient.UploadData метод:

client.Encoding = Encoding.UTF8;
client.Headers[HttpRequestHeader.ContentType] = "application/octet-stream";
byte[] fileContents = File.ReadAllBytes(filename);
client.UploadData(new Uri("http://" + ConnectionManager.FileServerAddress + ":" +
       ConnectionManager.FileServerPort +
       "/binary/up/" + category + "/" +
       Path.GetFileName(filename) + "/" + safehash), fileContents);
 Harry Mexican17 мая 2012 г., 22:46
Бинго! Я не ожидал такого простого решения. Спасибо
 Harry Mexican18 мая 2012 г., 12:01
К сожалению, похоже, что в WebClient.UploadData есть ошибка, заключающаяся в том, что она неправильно сообщает о ходе загрузки :(. Думаю, я буду придерживаться своего собственного HttpWebRequest

Ваш ответ на вопрос