HttpResponseMessage.Содержание.Заголовки ContentDisposition имеет значение null


При загрузке файла с помощью HttpClient я загружаю сначала заголовки, а затем содержимое. Когда заголовки загружаются, я могу видеть коллекцию заголовков на свойстве Content HttpResponseMessage, но при доступе к нему через ContentDisposition на заголовках, получить null скриншот

Почему это происходит? Скрипач показывает, что заголовки в порядке...

Код:

var responseMessage = await httpClient.GetAsync(uri, 
HttpCompletionOption.ResponseHeadersRead).ConfigureAwait(continueOnCapturedContext: false);

Обновление 1

Похоже, что этот класс следует реализации Content-Disposition, описанной в RFC 2616 и не справляется с обновлением реализации Content-Disposition RFC 6266. RFC 2616 определяет filename значение параметра как строку в кавычках , где обновление RFC 6266 просто указывает, что это должно быть значение.

Грамматика RFC 2616

content-disposition = "Content-Disposition" ":"
                          disposition-type *( ";" disposition-parm )
    disposition-type = "attachment" | disp-extension-token
    disposition-parm = filename-parm | disp-extension-parm
    filename-parm = "filename" "=" quoted-string
    disp-extension-token = token
    disp-extension-parm = token "=" ( token | quoted-string )

Грамматика RFC 6266

content-disposition = "Content-Disposition" ":"
                        disposition-type *( ";" disposition-parm )

 disposition-type    = "inline" | "attachment" | disp-ext-type
                     ; case-insensitive
 disp-ext-type       = token

 disposition-parm    = filename-parm | disp-ext-parm

 filename-parm       = "filename" "=" value
                     | "filename*" "=" ext-value

 disp-ext-parm       = token "=" value
                     | ext-token "=" ext-value
 ext-token           = <the characters in token, followed by "*">

Где ext-value = <ext-value, defined in [RFC5987], Section 3.2>

Примеры

Рабочий случай

Рабочий случай

Неудачный случай

Не дело

Обновление 2

Открыл билет С MS connect.

Обновление 3

Microsoft признала, что это ошибка и исправит ее.

2 18

2 ответа:

Проблема с трейлингом; в заголовке content-disposition

        [Fact]
        public void ParseContentDispositionHeader()
        {
            var value = ContentDispositionHeaderValue.Parse("attachment; filename=GeoIP2-City_20140107.tar.gz");
            Assert.Equal("GeoIP2-City_20140107.tar.gz",value.FileName);
        }

Если я добавлю точку с запятой, синтаксический анализ завершится неудачей. Если вы посмотрите на грамматику RFC6266, предполагается, что точка с запятой только предшествует параметру.

Спасибо-найти это определенно помогло мне. Для пользы других, вот мой обходной путь (как, по-видимому, это все еще вещь сегодня???)

Я нахожусь в несколько контролируемой среде, поэтому следующий код предполагает:

  • только один заголовок Content-Disposition
  • тег имеет следующий формат: inline; "filename";

Это приведет к сбросу заголовка ContentDisposition ответа, поэтому последующий код работает без проблем:

<!-- language: c# -->
if (response.Content.Headers.ContentDisposition == null)
{
  IEnumerable<string> contentDisposition;
  if (response.Content.Headers.TryGetValues("Content-Disposition", out contentDisposition))
  {
   response.Content.Headers.ContentDisposition = ContentDispositionHeaderValue.Parse(contentDisposition.ToArray()[0].TrimEnd(';').Replace("\"",""));
  }
}