عرض الصور المستمدة من بايت-مجموعة حيوي على الصفحة
سؤال
أنا استدعاء خدمة ويب التي تعود كمية غير معروفة من الصور في شكل مجموعة من البايت المصفوفات.(لا يمكنني تغيير هذا)
أحتاج إلى عرض كل صورة على واحد aspx صفحة ويب.
أنا حاليا باستخدام Microsoft.ويب.GeneratedImage السيطرة ؛ http://www.codeplex.com/aspnet/Release/ProjectReleases.aspx?ReleaseId=16449 لعرض الصور.
المشكلة لدي هو أنه منذ سيطرة يدعو منفصلة رمز الملف لتحميل محتوى الصورة, أنا باستخدام حالة جلسة لتخزين bytearray التي لست مفرط سعيدا.
هنا بعض التعليمات البرمجية من اختبار المشروع ؛
Private Sub btnGetChart_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnGetChart.Click
Dim reportHub As New HubWrapper
Dim repCharts() As ReportHub.Chart = reportHub.ReportHubChart(Me.ddlReports.SelectedValue, ViewState("params"))
For Each chart As ReportHub.Chart In repCharts
Dim sessionKey As String = "img" & System.Guid.NewGuid().ToString
Dim imgParam As New Microsoft.Web.ImageParameter()
imgParam.Name = "sessionVar"
imgParam.Value = sessionKey
Session(sessionKey) = chart.ChartData
Dim img As New Microsoft.Web.GeneratedImage
img.ImageHandlerUrl = "~/chartImageHandler.ashx"
img.Parameters.Add(imgParam)
phChart.Controls.Add(img)
Next
End Sub
<%@ WebHandler Language="VB" Class="chartImageHandler" %>
Imports System
Imports System.Collections.Specialized
Imports System.Drawing
Imports System.Web
Imports Microsoft.Web
Public Class chartImageHandler
Inherits ImageHandler
Implements IRequiresSessionState
Public Sub New()
MyBase.New()
'Set caching settings and add image transformations here
'EnableServerCache = True
End Sub
Public Overrides Function GenerateImage(ByVal parameters As NameValueCollection) As ImageInfo
Dim byteArry As Byte() = CType(HttpContext.Current.Session(parameters("sessionVar")), Byte())
HttpContext.Current.Session.Remove(parameters("sessionVar"))
Return New ImageInfo(byteArry)
End Function
End Class
ما هي الطريقة الأكثر أناقة من تحقيق هذا ؟
أي إدخال موضع ترحيب!!!
تحرير:معلومات إضافية;
- الصور من ويب هي قادمة من خدمات تقارير SQL.
- الصور عموما تغيير في كل وقت (لا الحقيقي التخزين المؤقت شرط).
- الصور تكون مستخدم معين.
- خدمة ويب هو إلا مرة واحدة في كل صفحة.
- أنا في الحقيقة التخلص من صورة من الدورة الدولة بعد إنشاء صورة يستخدم كما في الصورة لن تكون تحتاج إلى أن ينظر إليها مرة أخرى في حين.
المحلول
يمكنك تضمين بيانات الصورة مباشرة في مصدر الصفحة باستخدام data:
أوري المخطط. هنا ويكيبيديا الوصف.لا يعمل مع أي الإصدارات السابقة إلى 8 الرغم من ذلك ، والتي قد تجعل من غير المقبول من أجل الوضع الخاص بك.
نصائح أخرى
أنا افترض أنك تريد استدعاء خدمة ويب مرة واحدة فقط لكل صفحة الطلب.في الواقع, سيكون من الجيد أن بطريقة أو بأخرى ذاكرة التخزين المؤقت صفيف بايت ، حتى أن خدمة ويب لا يسمى مرة أخرى في حالة المستخدم لحظات يتحرك بعيدا عن الصفحة ثم يأتي مرة أخرى.في هذه الحالة توفير صفيف بايت في الدورة أمر لا مفر منه.إذا كنت لا تستخدم GeneratedImage التحكم, سوف لا تزال تحتاج إلى حفظ صفيف بايت في مكان ما.
أنا نفهم المخاوف الخاصة بك فيما يتعلق كبيرة الدورات.بناء على تفاصيل التطبيقات الخاصة بك, هناك بعض الأشياء التي يمكنك القيام به لتجنب ذلك.كل الصور تشير إلى مستخدم واحد أو بعض الصور المشتركة بين المستخدمين ؟ هل الصور تغيير في كثير من الأحيان ؟ إن جميع الصور تنتمي إلى مستخدم واحد و كثيرا ما تتغير ، ثم حفظها في الدورة هو الحل الوحيد.إذا كان بعض المستخدمين من مشاركة الصور أو الصور لا يتوقع تغيير في كثير من الأحيان, ثم يمكنك يمكن إنشاء بروكسي بين خدمة ويب و تطبيق ويب.الوكيل حفظ الصور ، سواء في الذاكرة أو في قاعدة بيانات (أو ربما في نظام الملفات) و جعلها متاحة الموارد من خلال تعيين URL.سوف تحتاج إلى تحديد هذا التعيين على أساس الداخلية من التطبيقات الخاصة بك.يمكن أن يكون شيئا مثل هذا:
http://imageproxy/username/photo123123
تحتاج أيضا إلى إنشاء عنوان URL إلى عودة عدد من الصور:
http://imageproxy/username/imagecount
لن تكون هناك حاجة إلى استخدام GeneratedImage المكون.يمكنك بسهولة بناء مصدر html للصفحة باستخدام معيار img العلامات.
في asp.net يمكنك كتابة وصورة مباشرة مع استجابة الكائن و المتصفحات الرئيسية سوف تكون قادرة على عرض.ولكن لا يمكن تمرير صفيف بايت, تحتاج إلى تمرير الذاكرة تيار.
الحصول على الخاص بك System.Web.HttpContext
Dim ms as New Io.MemoryStream(yourarray)
httpcontext.Response.OutputStream.Write(ms.ToArray,0,ms.Length)
تضع ذلك في العرض.صفحة aspx وإذا كان "yourarray" هو مجموعة من وحدات البايت التي تمثل صورة المتصفح سيتم عرض ذلك.
يمكنك ثم استخدام عنصر تحكم صورة في أي صفحة (حتى سهل html) وتعيين صورة المصدر أن "العرض.aspx" و الصورة سوف تظهر.
الآن بما أن لديك العديد من الصور ، قد تحتاج إلى إنشاء عنصر تحكم إنشاء عدة سبيل المثال ، واحدة لكل صورة اجتياز المقابلة صفيف بايت.