Дмитрий (или другие, которые ищут возможное решение), если в загруженном файле появляется html-страница, я подозреваю, что это связано с двойной проблемой HttpRequest GET. Типичным сценарием является следующая модель POST, Redirect, GET:
Браузер Android выдает POST-запрос HttpRequest на сервер (например, кнопка отправки или ссылка для запроса файла загрузки, имя файла.ext скажем)
Сервер направляет запрошенный файл filename.ext в байты, сохраняет его в переменной сеанса и затем выдает Response.Redirect для Download.aspx, например, для обработки конструкции объекта ответа
Браузер Android корректно отправляет HttpRequest GET на сервер для загрузки .aspx
Сервер отвечает типичным Content-Disposition: вложением; Конструкция стиля filename = "filename.ext" с объектом ответа, содержащим запрошенный filename.ext, который является байтами в переменной сеанса.
Менеджер загрузок Android, я полагаю, затем отправляет еще один запрос HttpRequest GET на сервер для Download.aspx. Я подозреваю, что менеджер загрузок интерпретирует предыдущий ответ «вложение» как триггер для отправки этого второго GET.
Сервер (Download.aspx) снова пытается создать объект ответа для отправки обратно в браузер.
Менеджер загрузки Android загружает файл filename.ext, используя содержимое объекта ответа из второго файла Download.aspx.
Во многих случаях это было бы хорошо. Но если, например, сервер в коде Download.aspx выполняет некоторую служебную работу и удаляет переменную сеанса при первом ее вызове, то в следующий раз переменная сеанса отсутствует. Таким образом, в зависимости от того, как написан код, возможно, что объект ответа не получит ясности и, возможно, не будет вызван Response.End, и в результате отправляется только HTML-файл Download.aspx.
Это то, что мы обнаружили с помощью Wireshark, хотя, признаюсь, я предполагаю, что причиной двойного GET является менеджер загрузок Android.
Надеюсь, это объяснение помогло.