VerySource

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 772|回复: 8

用HttpHandler还是用HttpModule?

[复制链接]

1

主题

11

帖子

8.00

积分

新手上路

Rank: 1

积分
8.00
发表于 2020-2-18 14:30:01 | 显示全部楼层 |阅读模式
对HttpHandler和HttpModule不是很熟悉,现在我想实现如下功能:

当用户请求形式如:/Info/Detail/*/*/*/*.aspx的时候,比如
/Info/Detail/2016/06/30/1584587.aspx,我首先判断该文件是否存在,如果不存在则创建,否则就直接访问该页面。功能类似与文件系统缓存。

我现在用了HttpHandler来处理,发觉文件已经创建了,但是访问该页面的窗口内容是空白的,如果把创建好的文件移动到其他目录,比如/Info/下就可以访问。后来我在MyHandler的ProcessRequest创建之后添加:
context.Response.Redirect(context.Request.Path);
也不行,会导致死循环加载~~

究竟应该怎么处理,还是应该使用HttpModule?

恳请各位给出思路,谢谢!!!
回复

使用道具 举报

0

主题

8

帖子

6.00

积分

新手上路

Rank: 1

积分
6.00
发表于 2020-4-26 22:00:01 | 显示全部楼层
用HttpHandler,或HttpHandlerFactory。
回复

使用道具 举报

0

主题

18

帖子

15.00

积分

新手上路

Rank: 1

积分
15.00
发表于 2020-4-27 10:45:01 | 显示全部楼层
处理特定类型文件是用 HttpHandler 没错。
不过如果文件 /Info/Detail/2016/06/30/1584587.aspx 不存在的话,IIS直接返回404错误给客户端,不会把请求传递给aspnet_isapi.dll处理,也就不会传递给你自己写的HttpHandler的。
我看你的描述有点奇怪。
回复

使用道具 举报

0

主题

322

帖子

115.00

积分

新手上路

Rank: 1

积分
115.00
发表于 2020-4-27 12:00:01 | 显示全部楼层
同意mgcfox

但 *.aspx如果不存在还是可以到HttpHandler的.
如果是其他就不行.因为*.aspx还是通过asp.net来解释的.

其他的就不行了.iis.直接报不存在了.
回复

使用道具 举报

0

主题

3

帖子

4.00

积分

新手上路

Rank: 1

积分
4.00
发表于 2020-4-27 12:45:02 | 显示全部楼层
用IO去判断。然后用server.transfer()去转向.
回复

使用道具 举报

1

主题

11

帖子

8.00

积分

新手上路

Rank: 1

积分
8.00
 楼主| 发表于 2020-4-30 07:30:02 | 显示全部楼层
谢谢楼上各位的回复,我的代码如下:
public void ProcessRequest(HttpContext context)
{
        string strFilePath = context.Server.MapPath(context.Request.Path);

        bool blnRebuild = false;
        if (!File.Exists(strFilePath))
        {
                blnRebuild = true;
        }

        if (blnRebuild)
        {
                //提取信息ID
                long lngInfoID = GetInfoIDByPath(context.Request.Path);
                CreateInfoDetailPage(lngInfoID, strMainWebRootPath);
        }

        if (!File.Exists(strFilePath))
        {
                context.Response.Redirect("/Info/Detail/notfound.aspx");
        }
        else
        {
                //context.Response.Redirect(context.Request.Path);
                //context.Server.Transfer(context.Request.Path);
                context.RewritePath(context.Request.Path);
        }
}

Server.Transfer都试过了,也不行啊。
回复

使用道具 举报

1

主题

11

帖子

8.00

积分

新手上路

Rank: 1

积分
8.00
 楼主| 发表于 2020-4-30 10:30:01 | 显示全部楼层
请求后没有抛出异常,返回的是空白窗口,查看网页源代码如下:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML><HEAD>
<META http-equiv=Content-Type content="text/html; charset=gb2312"></HEAD>
<BODY></BODY></HTML>
回复

使用道具 举报

0

主题

18

帖子

15.00

积分

新手上路

Rank: 1

积分
15.00
发表于 2020-7-11 21:30:01 | 显示全部楼层
shenmue024  
   
但 *.aspx如果不存在还是可以到HttpHandler的.
如果是其他就不行.因为*.aspx还是通过asp.net来解释的.

其他的就不行了.iis.直接报不存在了.

-------------------------------------------

确实如此, 被一片文章误导了。
这个还是比较奇怪。
  

回复

使用道具 举报

0

主题

18

帖子

15.00

积分

新手上路

Rank: 1

积分
15.00
发表于 2020-7-11 23:00:01 | 显示全部楼层
你查看一下你生成的文件正确已否。
然后在Trace.axd里看看执行情况。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|CopyRight © 2008-2023|verysource.com ( 京ICP备17048824号-1 )

快速回复 返回顶部 返回列表