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

by_封爱 by_封爱 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
微信授权的代码 简单说明一下.

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 没别的东西 为什么会影响呢?
...全文
评论 2
收藏 已收藏
分享
返回顶部
by_封爱
.NET社区 62,271 成员 668,968 内容