Aws-lambda-dotnet: الحصول على دعم ثنائي يعمل في تطبيق ويب ASP.NET Core

تم إنشاؤها على ٨ مارس ٢٠١٨  ·  5تعليقات  ·  مصدر: aws/aws-lambda-dotnet

أواجه بعض المشكلات في الحصول على دعم ثنائي يعمل مع تكامل 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);

وأضفت نوع الوسائط الثنائية في وحدة التحكم:
image

يُظهر سجل 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. لذلك أظن أن هناك مشكلة عامة.

guidance

التعليق الأكثر فائدة

سأغادر هذا هنا فقط لذا آمل أن يوفر على شخص آخر ساعة ...

رأس "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.

ال 5 كومينتر

لقد قمت بحل هذه المشكلة عند التحدث إلى AWS Support.

الحل:
بعد تغيير "أنواع الوسائط الثنائية" ، يجب عليك الانتقال والنقر فوق "نشر API":

image

مرحبًا يا أخي ، لقد اتبعت خطواتك ولكني لم أتمكن من الحصول على الصورة / الرمز.

هل فعلت أي شيء أكثر مما قلته؟

شكرا!

نعم ، تحتاج في الواقع إلى ضبط 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.

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات

القضايا ذات الصلة

bslatner picture bslatner  ·  5تعليقات

scionwest picture scionwest  ·  4تعليقات

briancullinan picture briancullinan  ·  7تعليقات

JustinGrote picture JustinGrote  ·  5تعليقات

pandaedward picture pandaedward  ·  6تعليقات