أواجه بعض المشكلات في الحصول على دعم ثنائي يعمل مع تكامل ASP.NET Core 2.
لذلك حاولت باستخدام مخطط "ASP.NET Core Web App" ، وهو يحتوي بالفعل على ملف favicon.ico
، والذي لا يتم عرضه عند نشره.
أعتقد أن المخطط يجب أن يعمل خارج الصندوق بنفس طريقة التشغيل على جهازك الخاص. أو ربما يجب عليك فقط إزالة favicon.ico.
قرأت التعليمات المتعلقة بمحتوى الاستجابة الثنائية هنا: https://github.com/aws/aws-lambda-dotnet/blob/master/Libraries/src/Amazon.Lambda.AspNetCoreServer/README.md
لذلك أضفت السطر التالي إلى LambdaEntryPoint.Init()
: RegisterResponseContentEncodingForContentType("image/x-icon", ResponseContentEncoding.Base64);
وأضفت نوع الوسائط الثنائية في وحدة التحكم:
يُظهر سجل Lambda بشكل صحيح أن الاستجابة بترميز base64:
START RequestId: 11a7e691-22d3-11e8-9b13-ef274abd9c03 Version: $LATEST
Incoming GET requests to /favicon.ico
ASP.NET Core Request PathBase: /Prod, Path: /favicon.ico
[Information] Microsoft.AspNetCore.Hosting.Internal.WebHost: Request starting GET https://XXX.execute-api.eu-west-1.amazonaws.com/Prod/favicon.ico
[Information] Microsoft.AspNetCore.StaticFiles.StaticFileMiddleware: Sending file. Request path: '/favicon.ico'. Physical path: '/var/task/wwwroot/favicon.ico'
[Information] Microsoft.AspNetCore.Hosting.Internal.WebHost: Request finished in 0.5675ms 200 image/x-icon
Response Base 64 Encoded: True
END RequestId: 11a7e691-22d3-11e8-9b13-ef274abd9c03
سجل بوابة API:
Starting execution for request: 577e5bb3-22d4-11e8-b061-1775958b34a4
HTTP Method: GET, Resource Path: /favicon.ico
Successfully completed execution
Method completed with status: 200
ما الجزء الذي فقدته؟
لقد وجدت العديد من المنشورات مع أشخاص لا يقومون بعمل ثنائي باستخدام تكامل وكيل lambda. لذلك أظن أن هناك مشكلة عامة.
لقد قمت بحل هذه المشكلة عند التحدث إلى AWS Support.
الحل:
بعد تغيير "أنواع الوسائط الثنائية" ، يجب عليك الانتقال والنقر فوق "نشر API":
مرحبًا يا أخي ، لقد اتبعت خطواتك ولكني لم أتمكن من الحصول على الصورة / الرمز.
هل فعلت أي شيء أكثر مما قلته؟
شكرا!
نعم ، تحتاج في الواقع إلى ضبط BinaryMediaTypes على */*
عند محاولة إظهار الصورة في المتصفح.
سيعمل BinaryMediaType image/x-icon
فقط إذا أرسل العميل رأس Accept
. إليك طريقة للاختبار:
$ curl -sH "Accept: image/x-icon" https://XXX.execute-api.eu-west-1.amazonaws.com/Prod/favicon.ico -o /tmp/favicon.ico
$ file /tmp/favicon.ico
/tmp/favicon.ico: MS Windows icon resource - 3 icons, 16x16, 256-colors
تجاهله :)
سأغادر هذا هنا فقط لذا آمل أن يوفر على شخص آخر ساعة ...
رأس "Accept" الافتراضي في طلب ملفات .png هو "image / a png" وليس "image / png"! كل شيء يعمل بمجرد أن أضفت:
protected override void Init(IWebHostBuilder builder)
{
//NB: Serverless WebAPI needs to have special config to serve binary file types:
RegisterResponseContentEncodingForContentType("image/png", ResponseContentEncoding.Base64);
RegisterResponseContentEncodingForContentType("image/jpeg", ResponseContentEncoding.Base64);
RegisterResponseContentEncodingForContentType("image/gif", ResponseContentEncoding.Base64);
RegisterResponseContentEncodingForContentType("image/apng", ResponseContentEncoding.Base64);
RegisterResponseContentEncodingForContentType("image/webp", ResponseContentEncoding.Base64);
RegisterResponseContentEncodingForContentType("image/x-icon", ResponseContentEncoding.Base64);
builder
.UseStartup<Startup>();
}
تحرير: قبول الرؤوس لمتصفح Chrome ويبدو أن IE11 يستخدم image/apng
كإعداد افتراضي لكن Firefox يرسل */*
<img>
لعلامات يمكنك إضافة */*
إلى القائمة أعلاه، وذلك _seems_ إلى العمل ولكن YMMV.
التعليق الأكثر فائدة
سأغادر هذا هنا فقط لذا آمل أن يوفر على شخص آخر ساعة ...
رأس "Accept" الافتراضي في طلب ملفات .png هو "image / a png" وليس "image / png"! كل شيء يعمل بمجرد أن أضفت:
تحرير: قبول الرؤوس لمتصفح Chrome ويبدو أن IE11 يستخدم
image/apng
كإعداد افتراضي لكن Firefox يرسل*/*
<img>
لعلامات يمكنك إضافة*/*
إلى القائمة أعلاه، وذلك _seems_ إلى العمل ولكن YMMV.