【求助】用IIS运行页面,验证码图片无法显示的问题。

Xuon 2009-02-23 02:19:08
“文件”——“打开”——“网站”——“本地IIS“ 打开ASP.NET(C#)的网站,能正常运行页面,只是验证码控件的图片显示不了(显示一个红叉)。

用“文件系统”的形式打开则可以正常显示

请问这个问题怎么解决?

验证码控件代码如下:


using System;
using System.Collections.Generic;
using System.ComponentModel;


using System.Text;
using System.Web;
using System.Web.UI.WebControls;
using System.Web.UI;
using System.Web.SessionState;
using System.Drawing;
using System.IO;

namespace AuthCode
{
[ToolboxData("<{0}:AuthCode runat=server></{0}:AuthCode>")]
public class AuthCode : WebControl
{
/// 〈summary>
/// 获得验证码的值
/// 〈/summary>
/// 〈returns>验证码〈/returns>
public string GetValue()
{
return HttpContext.Current.Session["value"].ToString();
}
[Bindable(true)]
[Category("Appearance")]
[Description("验证码字符长度")]
[DefaultValue("ss")]
[Localizable(true)]
//长度
internal static int mySize;

public int MySize
{
get { return AuthCode.mySize; }
set
{
AuthCode.mySize = value;

}
}


public AuthCode()
: base(HtmlTextWriterTag.Img)//重写父类的构造(输出流的HTML标记)
{ }
protected override void AddAttributesToRender(HtmlTextWriter writer)
{
base.AddAttributesToRender(writer);//将要输出的的HTML标签的属性和样式添加到指定的 HtmlTextWriter中
writer.AddStyleAttribute(HtmlTextWriterStyle.Cursor, "pointer");//添加样式

/**-
* 图片的onclick事件 "this.src='VerifyImg.jd?id='+Math.random()"
* 每次单击一次就有一个新的图片请求路径(VerifyImg.jd?id='+Math.random())参数只是
* 告诉浏览器这是一个新的请求然后经过 IHttpHander处理生成新的图片 id 没有任何实际意思(创造一个新的请求)
* -**/
writer.AddAttribute("onclick", "this.src='img.jd?id='+Math.random()");//添加js VerifyImg.jd


writer.AddAttribute(HtmlTextWriterAttribute.Src, "img.jd");
writer.AddAttribute("alt", "点击刷新");
}

}

public class AuthCodeHttpHander : IHttpHandler, IRequiresSessionState
{
/// <summary>
/// 返回验证码字符
/// </summary>
/// <param name="codeCount">验证码长度</param>
/// <returns></returns>
private string GetRandomNumberString(int codeCount)
{
string strChoice = "2,3,4,5,6,7,8,9,A,B,C,D,E,F,G,H,J,K,L,M,N,P,Q,R,S,T,U,V,W,X,Y,Z";
string[] strResult = strChoice.Split(new Char[] { ',' });
string strReturn = "";
Random rnd = new Random();
for (int i = 0; i < codeCount; i++)
{
int j = rnd.Next(strResult.Length);//随机数不能大于数组的长度
strReturn = strReturn + strResult[j].ToString();
}
return strReturn;
}

private Color GetColor()
{
return Color.Black;
}

private Bitmap CreateImage(string str_AuthCode)
{
/* -----------------------------绘制图片的样式 ------------------------------------*/

int width = str_AuthCode.Length * 13;
int height = 20;
Random rad = new Random();
Bitmap bmp = new Bitmap(width, height);
Graphics grp = Graphics.FromImage(bmp);// 在图片上绘制图形
grp.Clear(Color.White);//填充bmp的背景色
grp.DrawRectangle(new Pen(Color.Red, 1), 0, 0, width - 1, height - 1);//绘制边框
int num = width * height;
for (int i = 0; i < num; i+=3)//在图片的指定坐标上画上有颜色的圆点
{
int x = rad.Next(width);
int y = rad.Next(height);
int r = rad.Next(255);
int g = rad.Next(255);
int b = rad.Next(255);
Color c = Color.FromArgb(r, g, b);
bmp.SetPixel(x, y, c);//在图片的指定坐标上画上有颜色的圆点
}

/*-------------------------- 在图片绘制字符串------------------------------------ */

Font f = new Font("宋体", 12, FontStyle.Bold);//定义字体
Brush br = new SolidBrush(Color.Black);//定义画笔的颜色 及字体的颜色
for (int i = 0; i < str_AuthCode.Length; i++)
{
string s = str_AuthCode.Substring(i, 1);//单个单个的将字画到图片上
Point p = new Point(i * 12 + rad.Next(3), rad.Next(3) + 1);//字体出现的位置(坐标)
grp.DrawString(s, f, br, p);//绘制字符串
}
grp.Dispose();
return bmp;//返回

}


/// <summary>
/// 是否可以处理远程的HTTP请求
/// </summary>
public bool IsReusable
{
get { return true; }
}

/// <summary>
/// 将验证码图片发送给WEB浏览器
/// </summary>
/// <param name="context"></param>
public void ProcessRequest(HttpContext context)
{
int size = AuthCode.mySize; //Int32.Parse((String)context.Session["Size"]);
MemoryStream ms = new MemoryStream(); // 创建内存流(初始长度为0 自动扩充)
string NumStr = GetRandomNumberString(size);// 获得验证码字符
context.Session.Add("value", NumStr);//将验证码字符保存到session里面
Bitmap theBitmap = CreateImage(NumStr);// 获得验证码图片
theBitmap.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);//将位图写入内存流
context.Response.ClearContent(); //清除缓冲区里的所有内容输出
context.Response.ContentType = "image/jpeg"; //需要输出图象信息 要修改HTTP头
context.Response.BinaryWrite(ms.ToArray()); //将内存流写入HTTP输出流
theBitmap.Dispose(); //释放资源
ms.Close();//释放资源
ms.Dispose();//释放资源
context.Response.End();
}


}

}

...全文
3227 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
Xuon 2009-04-27
  • 打赏
  • 举报
回复
问题我已经解决了
blog.sina.com/xuezhide上有相应文章。
Freelifee 2009-04-03
  • 打赏
  • 举报
回复

<httpHandlers>
<add verb="*" path="*.jd" type="AuthCode.AuthCodeHttpHander" />
</httpHandlers>
我把这段代码添到webcofig 运行会报错 谁知道怎么回事? 好像是不能添加文本或什么ATA类型 没人遇到同样的错误吗
Xuon 2009-02-23
  • 打赏
  • 举报
回复
网上修改注册表、下载SP2验证码更新、修改IIS( 勾选“启用父路劲”)的方法我都试过了,还是没解决。

实在解决不了的话,谁传个IIS下可以正常显示的验证码控件给我吧(ASP.NET的),先谢了。
邮箱:xuezhide@qq.com
Xuon 2009-02-23
  • 打赏
  • 举报
回复
包括把画点的代码去掉再编译再使用,我也试过了。
Xuon 2009-02-23
  • 打赏
  • 举报
回复
改变图片类型?
我认真试过了,不行。
casinosun 2009-02-23
  • 打赏
  • 举报
回复
我是这样的
bmp.Save(ms, System.Drawing.Imaging.ImageFormat.Gif);
Response.ClearContent();
Response.ContentType = "image/Gif";
Response.BinaryWrite(ms.ToArray());
Xuon 2009-02-23
  • 打赏
  • 举报
回复
这个修改了程序的愿意哦。
casinosun 2009-02-23
  • 打赏
  • 举报
回复
把int num = width * height;
for (int i = 0; i < num; i+=3)//在图片的指定坐标上画上有颜色的圆点
{
int x = rad.Next(width);
int y = rad.Next(height);
int r = rad.Next(255);
int g = rad.Next(255);
int b = rad.Next(255);
Color c = Color.FromArgb(r, g, b);
bmp.SetPixel(x, y, c);//在图片的指定坐标上画上有颜色的圆点
}
去掉试试
casinosun 2009-02-23
  • 打赏
  • 举报
回复
用BitImage.Save(Response.OutputStream, ImageFormat.Gif)试试
Xuon 2009-02-23
  • 打赏
  • 举报
回复
我仔细想了一下,不是路劲的问题。
Xuon 2009-02-23
  • 打赏
  • 举报
回复
我是这样用的这个验证码控件的:
1:修改web.config

在<system.web></system.web>间加入下面的代码:

<httpHandlers>
<add verb="*" path="*.jd" type="AuthCode.AuthCodeHttpHander" />
</httpHandlers>


2:
开始——运行——cmd
cd C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727

csc /target:library AuthCode.cs

将得到的DLL文件添加到项目的引用中,在工具栏中右键点“选择项”——在.net组件中勾选“AuthCode”,将这个控件拖到页面中使用的。

你说的路劲问题我不明白.....因为上面的验证码控件代码我只理解一部分。
我使用这个控件的方法上面说的比较详细了,能找到我的问题么,我实在找不出来。

sy_binbin 2009-02-23
  • 打赏
  • 举报
回复
验证控件代码应该是没啥问题的!

可能是你验证控件的那个页面的路径有问题


writer.AddAttribute("onclick", "this.src='img.jd?id='+Math.random()");//添加js VerifyImg.jd


writer.AddAttribute(HtmlTextWriterAttribute.Src, "img.jd");
writer.AddAttribute("alt", "点击刷新");

看看红色部分的文件名和路径是不是正确

62,046

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧