Httpresponsemessage.content.headers contentDisposizione è nullo
-
21-12-2019 - |
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
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
caso fallimento
Aggiorna 2
Aperto un Ticket Con MS Connect.
Aggiorna 3
Microsoft ha riconosciuto che Questo è Un bug e lo aggiusterà.
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 è
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("\"",""));
}
}
.