Domanda

Durante il download di un file con httpclient, sto scaricando prima le intestazioni e poi il contenuto. Quando vengono scaricate le intestazioni, posso vedere la collezione di intestazioni sulla proprietà del contenuto di httpresponsemessage, ma quando si accede attraverso il contenutoDisposizione su intestazioni, ottenere null screenshot

Perché questo sta accadendo? Fiddler mostra le intestazioni sono belle ...

Codice:

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

Aggiornamento 1

Sembra che questa classe stia seguendo l'implementazione del contenuto-disposizione delineata in rfc 2616 e non riesce Gestire l'implementazione dell'implementazione del contenuto-disposizione RFC 6266 . RFC 2616 Definisce il valore del parametro filename per essere A Quotato-String , dove Aggiorna RFC 6266 afferma che dovrebbe essere valore .

RFC 2616 Grammatica

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 Grammatica

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 "*">
.

dove ext-value = <ext-value, defined in [RFC5987], Section 3.2>

Esempi

Custodia da lavoro

custodia di lavoro

caso fallimento

caso fallimento

Aggiorna 2

Aperto un Ticket Con MS Connect.

Aggiorna 3

Microsoft ha riconosciuto che Questo è Un bug e lo aggiusterà.

È stato utile?

Soluzione

Il problema è con il trailing;Nell'intestazione del contenuto-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);
        }
.

Se aggiungo il semi-colon il parsing fallirà.Se si guarda la grammatica RFC6266, il semi-colon dovrebbe precedere il parametro.

Altri suggerimenti

Grazie - Trovando questo sicuramente mi ha aiutato.A beneficio degli altri, ecco la mia soluzione alternativa (come apparentemente questo è ancora una cosa oggi ???)

Sono in un ambiente un po 'controllato, quindi il seguente codice presuppone:

    .
  • Solo un intestazione del contenuto-disposizione
  • Il tag è nel formato: inline; "filename";

Questo resetterà l'intestazione del contentDisposizione della risposta, quindi il codice successivo funziona perfettamente:

<!-- 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("\"",""));
  }
}
.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top