Использование обработчика для визуализации изображения из большого двоичного объекта на странице ASP.NET. Я не могу это понять

Я работаю над простым приложением для добавления тегов к изображениям и поиска. Мои изображения загружаются в БД, теги применяются, но я не могу их вернуть - изображения не отображаются.

Я нашел это здесь, на SO, но я ' м не могу заставить его работать.

Я думаю, что я, возможно, неправильно понимаю обработчиков.

Короче говоря, в коде позади я создаю ASP: Image, устанавливаю его imageurl для обработчика с идентификатором фотографии, а затем добавляю этот элемент управления в ASP: Placeholder.

Когда страница отображается, я получаю в IE этот маленький красный значок x без изображения, а в FF - ничего.

Одна вещь, которая заставляет меня думать, что я чего-то упускаю, - это то, что точка останова в моем коде обработчика никогда не срабатывает. Так что его даже казнят. Правильно?

Кто-нибудь знает, что я здесь делаю не так? Спасибо.

Вот мой куратор

Imports aapeClsLib
Imports System.Web
Imports System.Web.Services

Public Class photos
    Implements System.Web.IHttpHandler

    Sub ProcessRequest(ByVal context As HttpContext) Implements IHttpHandler.ProcessRequest

        Dim img As Byte() = getImage(context.Request.QueryString("ID"))
        context.Response.Clear()
        context.Response.ContentType = "image/jpeg"
        context.Response.BinaryWrite(img)
        context.Response.End()
    End Sub

    ReadOnly Property IsReusable() As Boolean Implements IHttpHandler.IsReusable
        Get
            Return False
        End Get
    End Property


    Private Function getImage(ByVal id As String) As Byte()
        Dim img As Byte()

        Dim strSql As String = "select ph_photo from photos where ph_id = " & id
        Dim dt As DataTable = sqLiteData.getDataTable(strSql)
        img = CType(dt.Rows(0)(0), Byte())

        Return img


    End Function
End Class

и куда я его вставляю в свой заполнитель

Private Sub insertPhotos(ByVal dt As DataTable)
     For Each row As DataRow In dt.Rows

         Dim img As New Image
         img.ImageUrl = "photos.ashx?ID=" & row(0)
         PlaceHolder1.Controls.Add(img)

     Next
 End Sub

person aape    schedule 29.08.2009    source источник


Ответы (3)


Пример C #, но для меня это работает нормально - вы можете добавить заголовок длины содержимого:

<%@ WebHandler Language="C#" Class="Photo" %>

using System;
using System.Web;

public class Photo : IHttpHandler {

    public void ProcessRequest (HttpContext context) {
        context.Response.ContentType = "image/jpeg";
        context.Response.BinaryWrite(System.IO.File.ReadAllBytes("C:\\Test.jpg"));
        context.Response.AddHeader("Content-Length", new System.IO.FileInfo("C:\\Test.jpg").Length.ToString());
    }

    public bool IsReusable {
        get {
            return false;
        }
    }

}

По сути, просто сначала выполните простой тест, если это сработает, я бы предложил данные, которые вы возвращаете из базы данных.

person Community    schedule 30.08.2009
comment
Га! Я полный нубчаек (извините, фраза меня бесит). Я ничего не писал в БД - в своей загрузке я просто устанавливал размер байта () и загружал его пустым. Спасибо чувак! - person aape; 01.09.2009

Похоже, вы не зарегистрировали обработчик в web.config и / или расширение в IIS. См. здесь и здесь для получения дополнительных сведений.

РЕДАКТИРОВАТЬ: теперь я вижу, что вы используете .ashx в качестве расширения, поэтому вам обычно не нужно его регистрировать. Теперь главная подсказка - это регистрация обработчика в web.config.

person Fabrizio C.    schedule 29.08.2009
comment
Итак, для IIS7 в интегрированном режиме мне нужно добавить в свой web.config следующее? ‹System.webServer› ‹handlers› ‹добавить name = photos verb = path = .ashx type = photos /› resourceType = Unspecified / ›‹handlers›‹ system.webServer › - person aape; 29.08.2009
comment
Просто добавил это, и после того, как я исправил недостающие закрывающие теги, он все еще не загружается. Я сделал это на действующем сайте, так как я дома, и у меня нет коробки разработки, с которой можно было бы возиться. - person aape; 29.08.2009
comment
Вы также должны добавить запись в раздел system.web. - person Fabrizio C.; 29.08.2009

Любопытно: вы используете большие двоичные объекты, чтобы избежать горячих ссылок? (Есть гораздо лучшие способы сделать это)

person msftwise    schedule 29.08.2009
comment
Нет, но это отвечает на другой вопрос, который крутился у меня в голове. Я просто делаю это для этого. Наконец-то у меня есть домен, и я могу использовать его, чтобы просто пробовать что-то и узнавать что-то новое - на работе , Я всегда занимаюсь их делами, и это все равно интранет, так что я никогда не смогу использовать его для портфолио или чего-то еще. - person aape; 29.08.2009