HttpResponseMessage.محتوى.رؤوس ContentDisposition باطل
-
21-12-2019 - |
سؤال
عند تحميل ملف مع HttpClient, أنا تحميل أول الرؤوس ثم المحتوى.عندما تكون رؤوس تحميل, أستطيع أن أرى رؤوس جمع على محتوى الملكية من HttpResponseMessage ، ولكن عند الوصول إلى ذلك من خلال ContentDisposition على رؤوس الحصول على باطل
لماذا يحدث هذا ؟ عازف الكمان يدل على رؤوس بخير...
كود:
var responseMessage = await httpClient.GetAsync(uri,
HttpCompletionOption.ResponseHeadersRead).ConfigureAwait(continueOnCapturedContext: false);
تحديث 1
يبدو أن هذه الفئة ما يلي ترتيب المحتوى المبينة في تنفيذ RFC 2616 وفشل في التعامل مع المحتوى الترتيب تنفيذ التحديث 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 الاتصال.
تحديث 3
مايكروسوفت قد اعترفت بأن هذا هو الخلل و سوف إصلاحه.
المحلول
المشكلة مع الزائدة؛في رأس المحتوى التصرف
giveacodicetagpre.إذا أضفت نصف القولون، فسوف تفشل التحليل.إذا نظرت إلى Grammar RFC6266، فمن المفترض أن تسبق شبه القولون فقط المعلمة.
نصائح أخرى
شكرا لك - إيجاد هذا بالتأكيد ساعدني.لصالح الآخرين, هنا هو الحل (كما يبدو أن هذا هو لا يزال شيء اليوم???)
أنا إلى حد ما بيئة تسيطر عليها ، لذلك البرمجية التالية يفترض:
- واحد فقط رأس المحتوى الترتيب
- العلامة في الشكل:
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("\"",""));
}
}