Есть следующий код:
static readonly HttpClient client = new HttpClient(handler);
private async Task RequestAsync(Guid ActId, string FileId, string FileName, string FileFolderName, string Description, string UploaderName, string UploadDate)
{
client.DefaultRequestHeaders.Add("Accept-Language", "en-US,en;q=0.5");
client.DefaultRequestHeaders.Add("Accept-Encoding", "gzip, deflate");
client.DefaultRequestHeaders.Add("Accept", "text/html, application/xhtml+xml, image/jxr, */*");
try
{
var url = FileLinkIBMFileNet.Replace("{file_id}", FileId).Replace("{file_name}", FileName);
var authToken = Encoding.ASCII.GetBytes($"{LoginIBMFilenet}:{PasswordIBMFileNet}");
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic",
Convert.ToBase64String(authToken));
byte[] tmpFileByte = await client.GetByteArrayAsync(url);
InsertFile(ActId, FileName, FileFolderName, tmpFileByte, Description, UploaderName, UploadDate, FileId);
}
catch (Exception ex) {
string message = string.Format("Error in RequestAsync\nMessage ---\n{0} \nSource ---\n{1} \nStackTrace ---\n{2} \nActId ---\n{3} \nFileId ---\n{4} \nFilename ---\n{5}", ex.Message, ex.Source, ex.StackTrace, ActId, FileId, FileName);
_logger.Error(message, ex);
throw ex;
}
}
Который через Fiddler при запросах всегда получает 200 ОК.
Но в коде у большинство файлов при получении ответа происходит следующая ошибка в методе
await client.GetByteArrayAsync(url);
Ошибка:
Сервер нарушил протокол. Section=ResponseHeader Detail=За возвратом каретки должен следовать перевод строки
Specified value has invalid Control characters. (Parameter 'value')
Source ---
System.Net.WebHeaderCollection
StackTrace ---
at System.Net.HttpValidationHelpers.CheckBadHeaderValueChars(String value)
at System.Net.WebHeaderCollection.Set(String name, String value)
at System.Net.HttpWebResponse.get_Headers()
at ITRusPostISO.ITMetasonicMigrationFile.ITMetasonicMigrationFileService.RequestAsync(Guid ActId, String FileId, String FileName, String FileFolderName, String Description, String UploaderName, String UploadDate)
Также прикрепляю скриншот Request/Response из Fiddler файла который нормально скачивается и которые падает в ошибку.

Response InternetExplorer при переходе по ссылке и скачивании файлов.

` Вот старый код на HttpWebRequest
private async Task RequestAsync(Guid ActId, string FileId, string FileName, string FileFolderName, string Description, string UploaderName, string UploadDate)
{
try{
string downloadLink = FileLinkIBMFileNet.Replace("{file_id}", FileId).Replace("{file_name}", FileName);
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(downloadLink);
request.Credentials = new NetworkCredential(LoginIBMFilenet, PasswordIBMFileNet);
request.Timeout = 180000;
request.AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate;
HttpWebResponse response = (HttpWebResponse)await request.GetResponseAsync();
WebHeaderCollection headers = response.Headers;
int streamSize = int.Parse(response.Headers["Content-Disposition"].Split(';')[2].Replace(" size=", ""));
byte[] tmpFileByte = new byte[streamSize];
using (Stream stream = response.GetResponseStream())
{
using (BinaryReader reader = new BinaryReader(stream))
{
reader.Read(tmpFileByte, 0, streamSize);
}
}
InsertFile(ActId, FileName, FileFolderName, tmpFileByte, Description, UploaderName, UploadDate, FileId);
response.Close();
}
catch(Exception ex) {
string message = string.Format("Error in RequestAsync\nMessage ---\n{0} \nSource ---\n{1} \nStackTrace ---\n{2} \nActId ---\n{3} \nFileId ---\n{4} \nFilename ---\n{5}", ex.Message, ex.Source, ex.StackTrace, ActId, FileId, FileName);
_logger.Error(message, ex);
throw ex;
}
}
Решение использовать tcpClient так как сервер шлет всегда битый response
var client = new HttpClient(handler);не создавайтеHttpClientна каждый запрос, это ошибка, вынесите его вprivate static readonlyполе. – aepot Oct 08 '20 at 09:10\r\n, а получает только\r. Так же убедитесь, что у вас внутри заголовка этот\rне встречается там, где не нужно, его hex код0x0d. Я в фидлере вижу какие-то непечатаемые квадратики в заголовке, может дело в них? – aepot Oct 08 '20 at 10:19SocketsHttpHandlerна предмет такой настройки. Вы уверены, что оно не сработает, вы пробовали? – aepot Oct 08 '20 at 11:18Accept-Languageи я бы убрал из него русский. – aepot Oct 08 '20 at 12:06WebRequestHandler(вместоHttpClientHandler) и использоватьuseUnsafeHeaderParsing, либо писать админам сервера, чтобы чинили сервер, потому что эта проблема вызвана именно кривым ответом от него, а не чем-либо другим. – aepot Oct 08 '20 at 12:29HttpWebRequest. А он есть и там и там. – aepot Oct 08 '20 at 13:01WebBrowser, а так жеWebView/WebView2, или дажеCefSharp. Можно попробовать приручить один из них. Ну и если совсем упороться, то можно гонять трафик через прокси-сервис, который будет парсить входящий трафик и фиксить ответ от сервера (типа MITM-подхода). А еще можно написать свою собственную простую реализацию HTTP с использованиемTcpClient, это самое легковесное из всего перечисленного. – aepot Oct 08 '20 at 14:29TcpClient– aepot Oct 08 '20 at 14:36try-catchиспользуйте. В целом, дальше я вам уже не помощник, знаю об этом еще меньше, чем гугл. :) – aepot Oct 08 '20 at 15:34Content-Encoding: gzipзаголовок в ответе присутствует? Если нет, значит ответ не запакован. – aepot Oct 09 '20 at 14:05