0

嗨,我编写了这个图像处理程序代码,它在我的本地工作正常并在页面中显示图像,现在我已将其上传到主机上,当我从远程请求页面时,图像不会显示在图像控件中!有什么帮助吗?!

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

using System;
using System.Configuration;
using System.Data.SqlClient;
using System.Web;

public class Handler : IHttpHandler, System.Web.SessionState.IRequiresSessionState
{

    SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["IranQRDBConnectionString"].ConnectionString);
    public void ProcessRequest(HttpContext context)
    {
        try
        {
            string TableName = context.Session["TableToQuery"].ToString();
            string ID = context.Session["ID"].ToString();

            SqlCommand comm = new SqlCommand("SELECT * FROM " + TableName + " WHERE ID=" + ID, conn);

            conn.Open();
            SqlDataReader dr = comm.ExecuteReader();
            dr.Read();
            context.Response.ContentType = "image/jpeg";
            context.Response.BinaryWrite((byte[])dr["Image"]);
            conn.Close();

        }
        catch
        {
            SqlCommand comm = new SqlCommand("SELECT * FROM DefaultImage WHERE ID=1", conn);

            conn.Open();
            SqlDataReader dr = comm.ExecuteReader();
            dr.Read();
            context.Response.ContentType = "image/jpeg";
            context.Response.BinaryWrite((byte[])dr["Image"]);
            conn.Close();
        }
    }

    public bool IsReusable
    {
        get
        {
            return false;
        }
    }

}

我的连接字符串:

    <add name="ConnectionString" connectionString="Data Source=myDatasource;Initial Catalog=DB;User Id=myusername;Password=mypassword"
   providerName="System.Data.SqlClient" />

这是我显示图像的数据列表:

' /> '>

我检查了我的数据库,数据插入正确,文本数据回发到我的页面,但只有图像没有显示

这是我的 webconfig 部分:

<system.webServer>
    <validation validateIntegratedModeConfiguration="false"/>
    <modules>
        <remove name="ScriptModule"/>
        <add name="ScriptModule" preCondition="managedHandler" type="System.Web.Handlers.ScriptModule, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
    </modules>
    <handlers>
        <remove name="WebServiceHandlerFactory-Integrated"/>
        <remove name="ScriptHandlerFactory"/>
        <remove name="ScriptHandlerFactoryAppServices"/>
        <remove name="ScriptResource"/>
        <add name="ScriptHandlerFactory" verb="*" path="*.asmx" preCondition="integratedMode" type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
        <add name="ScriptHandlerFactoryAppServices" verb="*" path="*_AppService.axd" preCondition="integratedMode" type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
        <add name="ScriptResource" preCondition="integratedMode" verb="GET,HEAD" path="ScriptResource.axd" type="System.Web.Handlers.ScriptResourceHandler, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
    </handlers>
</system.webServer>
4

2 回答 2

1

首先,您并不总是处理您的数据库连接。如果您的catch块中出现异常,您将不会关闭该连接。此外,如果在conn.Open()之后的try块中抛出异常,您最终将打开连接两次。 始终使用using语句来管理实现IDisposable的资源的生命周期。

其次,捕获异常作为回退到默认图像的一种方式并不是好的风格。实际上,您可能正在泄漏资源(我不清楚阅读代码的确切位置是抛出异常的位置)。

至于核心问题,我认为没有足够的信息来回答为什么在部署代码后图像没有显示。

您的数据库连接字符串是否正确?你从第一次得到什么

comm.ExecuteReader()

?

如果抛出异常,什么异常,在哪里?

如果您将日志记录添加到代码中以回答这些问题,那么问题的根源很可能会变得明显。如果没有,请用这些答案更新您的问题。

于 2012-08-06T07:52:32.860 回答
1

除了使用 Seesion 之外,您为什么不尝试使用查询字符串。这是我使用查询字符串的代码,我从数据库中获取图像,而无需在本地文件夹中创建所需图像的任何实例。跳这有帮助。

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

using System;
using System.Web;
using System.Configuration;
using System.IO;
using System.Data;
using System.Data.SqlClient;

public class DisplayImg : IHttpHandler
{

    public void ProcessRequest(HttpContext context)
    {
        string theID;
        if (context.Request.QueryString["id"] != null)
            theID = context.Request.QueryString["id"].ToString();
        else
            throw new ArgumentException("No parameter specified");

        context.Response.ContentType = "image/jpeg";
        Stream strm = DisplayImage(theID);
        byte[] buffer = new byte[2048];
        int byteSeq = strm.Read(buffer, 0, 2048);

        while (byteSeq > 0)
        {
            context.Response.OutputStream.Write(buffer, 0, byteSeq);
            byteSeq = strm.Read(buffer, 0, 2048);
        }
    }

    public Stream DisplayImage(string theID)
    {
        SqlConnection connection = new SqlConnection(ConfigurationManager.ConnectionStrings["SERVER"].ConnectionString.ToString());
        string sql = "SELECT Server_image_icon FROM tbl_ServerMaster WHERE server_Code = @ID";
        SqlCommand cmd = new SqlCommand(sql, connection);
        cmd.CommandType = CommandType.Text;
        cmd.Parameters.AddWithValue("@ID", theID);
        connection.Open();
        object theImg = cmd.ExecuteScalar();
        try
        {
            return new MemoryStream((byte[])theImg);
        }
        catch
        {
            return null;
        }
        finally
        {
            connection.Close();
        }
    }

    public bool IsReusable
    {
        get
        {
            return false;
        }
    }
} 

只需在 CS 代码中添加一行

UploadImg.ImageUrl = "~/DisplayImg.ashx?id=" + code;
于 2012-11-09T11:21:30.520 回答