IHttpHandler执行1次,代码执行2次

by_封爱 2018-10-30 03:48:54
微信授权的代码 简单说明一下.

OAuth.ashx

var code=request["code"]??"";
var openid="";
if code==""
{
//没授权 生成url 跳转到微信 回调.
var url="open.weix.......?redirect_uri=OAuth.ashx";
log(url);
Response.Redirect(url);
}
else
{
//已经授权 根据code token拿用户信息.
var user="api/userinfo/token=....code=....";
openid=user.openid;
}
var url="list.aspx?uid="+openid;
Response.Redirect(url);


看起来也没问题...而且这代码也运行几年了.. 授权都正常 第一次不带code 跑到微信拿授权 回来有code 然后拿用户信息.

而且我确定Redirect之后的代码 不会在执行..

最近要加一个日志处理下接口耗时.. 于是我写了一个IHttpModule 代码大概如下.


context.BeginRequest += context_BeginRequest;
context.EndRequest += context_EndRequest;

void context_BeginRequest(object sender, EventArgs e)
{
var application = sender as HttpApplication;
var context = application.Context;
var request = context.Request;
var response = context.Response;
var fidder = new string[2] { "ashx", "aspx" };
var path = request.Path.ToLower().Split('.')[1];
if (fidder.Contains(path))
{
var stopwatch = new Stopwatch();
stopwatch.Start();
context.Items[KEY] = stopwatch;
}
}
void context_EndRequest(object sender, EventArgs e)
{
var application = sender as HttpApplication;
var context = application.Context;
var request = context.Request;
var response = context.Response;
var stopwatch = context.Items[KEY] as Stopwatch;
if (stopwatch != null)
{
stopwatch.Stop();
var time = stopwatch.ElapsedMilliseconds;
var txt = new StringBuilder();
txt.Append(request.Url.Host);
txt.Append(request.Url.Port.ToString()));
txt.Append(request.Url.AbsolutePath);
txt.Append(request.Url.Query);


var url = txt.ToString();
var md = request["method"] ?? "-1";
var ip = request.ServerVariables["HTTP_X_FORWARDED_FOR"] ?? "";
if (ip == "")
{
ip = request.ServerVariables["REMOTE_ADDR"] ?? "";
}
var sql = "insert.........";
DapperHelper.Execute(sql, new
{
reqtime = DateTime.Now,
reqIP = ip,
url,
method = md,
totalTime = time
});

context.Items[KEY] = null;
}
}



这代码加上 并且在webserver节点配置之后 居然影响了上面授权代码...

从insert 的日志来看 代码执行了2次 第一次没code 第二次有code 是正常情况.

但是从log(url)来看.. 同样的url 输出了2次..


2018-10-30 14:31:45:3108:https://open.weixin.qq.com/connect/oauth2/authorize...

2018-10-30 14:31:45:6546:https://open.weixin.qq.com/connect/oauth2/authorize...

这个是我之前截取的.. 因为这个code有一次有效 所以他又请求了腾讯接口一次 第一次就失效了..

然后我就获取不到openid了...


一旦进行使用"过滤器". 那么这代码就失效..

如果注视掉的话.. 就没问题....

所以问题在哪呢?


----------------------------------------------分割线2018年10月30日 17:52:32------------------------------------

经过我几次的测试.我发现了..在end_request方法里面..

如果啥都不写.. 正常

然后我一行一行测试..

发现 居然是执行sql的那句话有问题..

只要执行insert语句. 那么就会执行2次上面的代码..

如果//. 就是正常的.

敢问. 我执行sql 跟他们有关系吗?


public static int Execute(string sql, object paramObj = null)
{
using (var Conn = DbHelperMySQL.GetCon())
{
return Conn.Execute(sql, paramObj);
}
}


就用了dapper 没别的东西 为什么会影响呢?
...全文
207 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
数据库,以及事务,是性能杀手。
  • 打赏
  • 举报
回复
引用 楼主 diaodiaop 的回复:
就用了dapper 没别的东西 为什么会影响呢?
你的数据库查询太慢了。你就试试
select 1
看是不是好那么一点点? 既然非要花费巨大时间去访问数据库,那么就异步访问吧。不要同步访问。

62,046

社区成员

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

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

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

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