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

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 コードに 1 行追加するだけです

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

まず第一に、データベース接続を常に破棄しているわけではありません。catchブロックで例外がスローされた場合、その接続は閉じられません。また、 conn.Open()の後にtryブロックで例外がスローされた場合、接続を 2 回開くことになります。 IDisposableを実装するリソースのライフサイクルを管理するには、必ずusingステートメントを使用してください。

次に、デフォルト イメージにフォールバックする手段として例外をキャッチするのは、適切なスタイルではありません。実際、リソースをリークしている可能性があります (例外がスローされている正確なコードを読んでもわかりません)。

核となる問題については、コードをデプロイした後に画像が表示されない理由を説明するのに十分な情報があるとは思えません。

データベース接続文字列は正しいですか? 最初から何を得ることができますか

comm.ExecuteReader()

?

例外がスローされた場合、どの例外とどこで?

これらの質問に答えるためにコードにロギングを追加すると、問題の原因が明らかになる可能性が高くなります。そうでない場合は、それらの回答で質問を更新してください。

于 2012-08-06T07:52:32.860 に答える