سؤال

أنا استدعاء خدمة ويب التي تعود كمية غير معروفة من الصور في شكل مجموعة من البايت المصفوفات.(لا يمكنني تغيير هذا)

أحتاج إلى عرض كل صورة على واحد 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" و الصورة سوف تظهر.

الآن بما أن لديك العديد من الصور ، قد تحتاج إلى إنشاء عنصر تحكم إنشاء عدة سبيل المثال ، واحدة لكل صورة اجتياز المقابلة صفيف بايت.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top