#vb.net #webrequest
#vb.net #веб-запрос
Вопрос:
У меня возникла небольшая проблема, которая поставила меня в тупик.
Итак, это небольшая программа, которую я написал несколько лет назад во время обучения, с тех пор она безупречно выполняла свою работу вплоть до нескольких дней назад. По сути, просто создайте службу SOAP и загрузите файл.
httpRequest = WebRequest.Create(My.Settings.RequestAddress)
Using httpResponse As WebResponse = httpRequest.GetResponse
Using responseStream = New IO.StreamReader(httpResponse.GetResponseStream, StreamEncoding)
Dim SourceFileName As String = GetSourceFileName(httpResponse.Headers.GetValues("content-disposition"))
'httpResponse.Headers.GetValues("content-disposition") is returning nothing
Dim StreamFileName As String = IO.Path.Combine("c:Temp", SourceFileName)
Using StreamWrite = New IO.StreamWriter(StreamFileName, False, StreamEncoding)
Do While Not responseStream.EndOfStream
StreamWrite.WriteLine(responseStream.ReadLine)
Loop
StreamWrite.Flush()
End Using
End Using
End Using
Private Function GetSourceFileName(ByVal dispositionAttrib As String) As String
Dim retVal As String = String.Empty
Dim strArr As String() = Split(dispositionAttrib, "=")
If strArr.Length > 1 Then
retVal = strArr(1)
End If
Return retVal
End Function
По какой-либо причине, которую я не могу понять, атрибут заголовка «содержимое-расположение» не отображается.
Я могу совершать точно такие же вызовы через postman, и это есть. Прошли и проверили заголовок.Коллекция ключей также отсутствует, никаких признаков этого. Чего мне не хватает?
Обновление Просто в качестве пробной версии, изменил веб-запрос на HttpClient. По-прежнему отсутствует расположение содержимого
Using client As New HttpClient()
Dim response = client.GetAsync(My.Settings.RequestAddress).Result
Dim fileNameAttribute = response.Headers.GetValues("content-disposition")
Console.WriteLine(fileNameAttribute)
End Using
Ответ обновить.Значение заголовка, которое я получаю при просмотре через отладчик, равно:
{Pragma: длина содержимого без кэша: 27 Управление кэшем: тип частного содержимого: текст / html; кодировка = utf-8 Дата: Ср, 02 Сен 2020 20:45:37 GMT Истекает: Вт, 01 сен 2020 20:45:38 GMT Набор cookie: ASP.NET_SessionId=0kqeh5d1a2fni35chmbpibqv; путь =/; HttpOnly; SameSite= Lax Сервер: Microsoft-IIS /10.0 X-AspNet-Версия: 4.0.30319 X-Работает от: ASP.NET
}
Мне интересно об этой пустой строке внизу после X-Powered-By
Комментарии:
1.
Headers.GetValues()
возвращает массив строк, а не строку, и это не обязательно. Но, поскольку вы видите это в Postman… Прочитайте это как простоhttpResponse.Headers("Content-Disposition")
. Кроме того, изменитеdim httpRequest = WebRequest.CreateHttp(My.Settings.RequestAddress)
иUsing httpResponse As HttpWebResponse = DirectCast(httpRequest.GetResponse(), HttpWebResponse)
— Как вы определилиStreamEncoding
перед чтением потока (вы сравнивали сhttpResponse.CharacterSet
)?2. @Jimi, все правильные комментарии, но плохое кодирование в сторону. Изменен на HttpResponse. Заголовки («Расположение содержимого»), но по-прежнему ничего не возвращают. Что касается кодировки, честно говоря, не могу вспомнить, как я добрался до UTF-8, но это набор символов, который я получаю в ответе
3. Для всех, кто интересуется, по-прежнему нет решения для отсутствия «content-disposition», но с несколькими изменениями в восходящем потоке я переработал решение для использования имени временного файла, в котором, похоже, все работает снова