ASP.NET 全局错误处理程序中的 WebMethod:如何捕获 AJAX POST 请求中传递的值

2023-12-03

换句话说,使用 HttpContext,我如何检索传递给[WebMethod]什么时候在全局错误处理程序中?

Kovu 给出了一个很好的例子如何做一个全局错误陷阱来抓取[WebMethod]Global.asax 中的错误,我认为他是从那里得到的理查德刘在这里,但他的解决方案没有捕获传递给 WebMethod 的参数,我确实需要记录这些参数来重现错误。

我改编了 Richard/Kovu 的示例来开始捕获有关请求的更多内容,但我只是找不到输入参数的位置[WebMethod]被隐藏。

/*  global.asax */
protected void Application_PostMapRequestHandler(object sender, EventArgs e)
{
    /*    REQUIRES         
      <system.web>
        <customErrors mode="Off"/>
        TO WORK IN PRODUCTION
    */

    HttpContext context = HttpContext.Current;
    if (context.Handler is Page && !string.IsNullOrEmpty(context.Request.PathInfo))
    {
        string contentType = context.Request.ContentType.Split(';')[0];
        if (contentType.Equals("application/json", StringComparison.OrdinalIgnoreCase))
        {
            context.Response.Filter = new PageMethodExceptionLogger(context);
        }
    }
}

using System.Collections.Generic;
using System.IO;
using System.Web;
using System.Web.Script.Serialization;

public class PageMethodExceptionLogger : Stream
{
    private readonly HttpContext _context;
    private readonly Stream _baseStream;
    private readonly MemoryStream _capturedStream = new MemoryStream();

    public PageMethodExceptionLogger(HttpContext context)
    {
        _context = context;
        _baseStream = context.Response.Filter;
    }

    public override void Close()
    {
        if (_context.Response.StatusCode == 500 && _context.Response.Headers["jsonerror"] == "true")
        {

            string sErr = "trapped json error, probably in [WebMethod]:\r\n\r\n";

            //this will log the error and stack trace.
            _capturedStream.Position = 0;
            string responseJson = new StreamReader(_capturedStream).ReadToEnd();
            JavaScriptSerializer js = new JavaScriptSerializer();
            var jsonObject = js.DeserializeObject(responseJson) as Dictionary<string, object>;
            foreach (string sKey in jsonObject.Keys)
                sErr += string.Format("{0}:\r\n{1}\r\n\r\n", sKey, jsonObject[sKey]);

            //============= LOG THE INPUT PARAMETERS ========================================================

            sErr += "\r\n=== Request ===\r\n";
            sErr += "Content Type = " + _context.Request.ContentType + "\r\n";
            sErr += "Content Encoding = " + _context.Request.ContentEncoding.BodyName + "\r\n";
            _context.Request.InputStream.Position = 0;


        //========= this holds the parameters passed to the [WebMethod] ========
        // It holds a JSON string, so could deserialize as above, but 
        //   useful to see the original string format for debugging 
        //   purposes, as the json format could be the issue that triggered this log!! ;-)
        sErr += "\r\n=== INPUT ===\r\n";
        try
        {
            long iReadLen = _context.Request.InputStream.Length;
            if (iReadLen > 0)
            {
                var bytes = new byte[iReadLen];
                _context.Request.InputStream.Position = 0;
                _context.Request.InputStream.Read(bytes, 0, (int)iReadLen);
                sErr += System.Text.Encoding.UTF8.GetString(bytes) + "\r\n";
            }
            else
            {
                sErr += "Request.InputStream is empty\r\n";
                sErr += System.Text.Encoding.Default.GetString(_context.Request.BinaryRead(_context.Request.TotalBytes));

            }
        }
        catch(Exception oEx)
        {
            sErr += "Error reading Request.InputStream; " + oEx.Message;
        }

            sErr += "\r\n=== HEADERS ===\r\n";
            sErr += HttpUtility.UrlDecode(_context.Request.Headers.ToString()).Replace("&", "\r\n") + "\r\n";

            sErr += "\r\n=== USER ===\r\n";
            try
            {
                sErr += "Current User = " + _context.User.Identity.Name + "\r\n\r\n";
            }
            catch
            {
                sErr += "oContext.User.Identity.Name could not be retrieved!!!\r\n\r\n";
            }


            //====== LOG THE SESSION ========
            sErr += "\r\n=== Session Variables ===\r\n";
            if (_context.Session == null)
            {
                sErr += "session object is null\r\n";
            }
            else
            {
                sErr += "There are " + _context.Session.Count.ToString() + " session variables\r\n";
                foreach (string sKey in _context.Session)
                {
                    sErr += sKey + "=" + _context.Session[sKey].ToString() + "\r\n";
                }
            }

            sErr += "\r\n";

            clsErrorHandler.LogMessage(sErr);

        }

        _baseStream.Close();
        base.Close();
    }

    public override void Flush()
    {
        _baseStream.Flush();
    }

    public override long Seek(long offset, SeekOrigin origin)
    {
        return _baseStream.Seek(offset, origin);
    }

    public override void SetLength(long value)
    {
        _baseStream.SetLength(value);
    }

    public override int Read(byte[] buffer, int offset, int count)
    {
        return _baseStream.Read(buffer, offset, count);
    }

    public override void Write(byte[] buffer, int offset, int count)
    {
        _baseStream.Write(buffer, offset, count);
        _capturedStream.Write(buffer, offset, count);
    }

    public override bool CanRead { get { return _baseStream.CanRead; } }
    public override bool CanSeek { get { return _baseStream.CanSeek; } }
    public override bool CanWrite { get { return _baseStream.CanWrite; } }
    public override long Length { get { return _baseStream.Length; } }

    public override long Position
    {
        get { return _baseStream.Position; }
        set { _baseStream.Position = value; }
    }
}

现在这段代码给出了以下输出。(格式很混乱,因为我不知道如何使用所见即所得编辑器,抱歉)。

=================================================== ========== 捕获的 json 错误,可能在 [WebMethod] 中:

消息:传入的对象无效,应为“:”或“}”。 (23): {'sKitName':'christin'a'}

堆栈跟踪:位于 System.Web.Script.Serialization.JavaScriptObjectDeserializer.DeserializeDictionary(Int32 深度)在 System.Web.Script.Serialization.JavaScriptObjectDeserializer.DeserializeInternal(Int32 深度)在 System.Web.Script.Serialization.JavaScriptObjectDeserializer.BasicDeserialize(字符串 输入、Int32 深度限制、JavaScriptSerializer 序列化器)位于 System.Web.Script.Serialization.JavaScriptSerializer.Deserialize(JavaScriptSerializer 序列化器、字符串输入、类型类型、Int32 深度限制)位于 System.Web.Script.Serialization.JavaScriptSerializer.Deserialize[T](字符串 输入)在 System.Web.Script.Services.RestHandler.GetRawParamsFromPostRequest(HttpContext 上下文,JavaScriptSerializer 序列化器)位于 System.Web.Script.Services.RestHandler.GetRawParams(WebServiceMethodData methodData、HttpContext 上下文)位于 System.Web.Script.Services.RestHandler.ExecuteWebServiceCall(HttpContext 上下文、WebServiceMethodData 方法数据)

异常类型:System.ArgumentException

=== 输入 === {'sKitName':'christin'a'}

=== headers === Connection=keep-alive Content-Length=25 Content-Type=application/json;字符集=UTF-8 接受=application/json, 文本/JavaScript,/; q=0.01 接受编码=gzip, deflate 接受语言=en-US,en;q=0.9 Cookie=.ADAuthCookie=A12630A2F7FEA673C36FDC28C7625ED4C4C92760B0EEE6C68C8068FF81A8773DF1916B4A067326576F4D067D4C26C874A9C3C96D81F74D15E0452EDD7 43C3472F530DE5E6542E8DE1DD19BF76114702F70AF483DBF963C8686727CB541151EBF32322CD647ADD6D9FC01C4785393227F19341D2BE320DF821E0E223A24B7FBB5E5 CA7F79D87815AF49AF24C455CA81FD; ASP.NET_SessionId=iqc0ztobmcva4lqbtii222fa 主机=web04.local 推荐人=http://web04.local/APP/Chem_View/Reagent_Kit_Inventory.aspx用户代理=Mozilla/5.0(Windows NT 10.0;Win64;x64) AppleWebKit/537.36(KHTML,如 Gecko)Chrome/76.0.3809.132 Safari/537.36 起源=http://web04.localX-Requested-With=XMLHttpRequest

=== 用户 === 当前用户 = lila.whitehead

=== 会话变量 === 有 1 个会话变量 dtTouched=

于 2019 年 9 月 9 日 2:37:00 下午

=================================================== =========


None

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ASP.NET 全局错误处理程序中的 WebMethod:如何捕获 AJAX POST 请求中传递的值 的相关文章

随机推荐

  • 如何在 TypeScript 中将值传递给 Context Provider?

    我正在尝试将我的反应脚本转换为打字稿 但在定义类型时遇到问题 export const inputListContext createContext
  • 使用 Bcrypt 密码验证登录

    我有一个网站 我正在使用 bcrypt 编写注册 登录系统 我已成功将注册详细信息和哈希密码插入数据库中 我的问题是如何使用此哈希密码对用户进行身份验证 以下是我使用的代码 注册动作 font face arial font
  • 如何将数组传递给 Rails 中的 fields_for?

    我想用fields for在关联中的记录子集上 我有一个Month模型 其中has many payments 但在我看来 以我的形式 我只想拥有fields for其中一些付款 例如 fields for month payments l
  • 简单的 for 循环需要解释

    Since i i是缩写i i i 以下代码 for var i 0 i lt 10 i console log i i 应该输出 1 0 because 0 0 0 i 0 2 2 because 0 1 1 i 2 3 6 becaus
  • Xcode - 基于Target导入具有相同名称的不同头文件

    我有一个具有多个目标的项目 每个目标都构建非常相似的应用程序版本 但具有不同的图像资源和 plist 对于 plists images 来说这很好 但我使用 ShareKit 和 Appirater 框架 它们的配置带有 defines 的
  • iOS 正在将 28.0KB 的一些未知数据从我的应用程序备份到 iCloud

    我的应用程序因未将 不备份 属性设置为我使用的两个内部文件 并存储在 Documents 中 而被拒绝 我已经设置了该属性 并且它不再备份这些文件 11 5MB 但它仍在备份 28kb 的一些数据 我从 Documents 文件夹中删除了所
  • C 中的函数指针如何工作?

    我最近对 C 中的函数指针有了一些经验 因此 按照回答自己问题的传统 我决定对基础知识做一个小总结 供那些需要快速深入了解该主题的人使用 C 中的函数指针 让我们从一个基本函数开始指向 int addInt int n int m retu
  • 如何创建表 AWS Athena --> 映射 Json 数组?

    如何为 Json 数组格式创建表 Athena AWS JSON 格式示例 Tapes Status AVAILABLE Used 0 0 Barcode TEST1217F7 Gateway Test Report UsedGB 0 0
  • 将 ASP.NET MVC 5 从 .NET 4.5 降级到 4.0

    坐着面对一个有趣的问题 服务器不支持 NET 4 5 客户端没有提到这一点 但该应用程序是使用 ASP NET MVC 5 编写的 仅在 NET 4 5 上运行 所以降级dot net就意味着降级ASP NET MVC版本 我们遇到的许多错
  • 展开转场不触发

    我学习得很快 并为我的大部分应用程序奠定了基础 我有以下故事板 应用故事板 一切正常 例如 我在添加课程视图控制器上有一个展开转场 当您按下 保存 并且您返回到 您的课程 视图控制器时 该控制器会触发 当您在我的课程视图控制器上时 您可以选
  • Checkedtextview 滚动Listview后选中/取消选中

    我正在使用 viewHolder 和 getview 在 listvew 中开发 checktextview 填充检查 取消检查状态绑定从数据库运行良好 但是 如果我选中项目然后滚动列表视图 它将返回取消选中 这是我的自定义适配器代码 pu
  • SQLite 存储、检索和比较 DATETIME 字段

    我真的很难在 Objective C 中比较 SQLite 查询中的日期 这就是我正在做的事情 存储日期 这个文件告诉我使用下面指定的日期格式 但它似乎不正确 我尝试使用yyyy MM dd hh mm ss但也没有成功 NSDate to
  • 堆栈中的 Activity 过多会使应用程序变得非常慢

    最近我创建了一个社交应用程序 我没有使用fragment 项目快完成了 我有几个活动 例如用户配置文件 关注者 关注者活动 通常情况下它工作得很好 但是 如果用户单击 UserA UserProfile 活动 gt 然后单击 A 的关注者
  • MDN 示例中不必要使用 calc()?

    我刚刚读了 CSS 函数calc 在 Mozilla 的开发者网络中 第一个例子在本文使用以下 CSS 代码 banner position absolute left calc 40px width calc 100 80px borde
  • 受二次约束的线性目标最大化

    我有一篇论文中的编程公式 想给它一个解决特定问题的工具 作者将其描述为线性规划 LP 实例 但我不确定 公式有点像如下 max x1 x2 x3 s t x1 x3 x4 x5 lt 10 x2 x5 x3 x7 x1 x9 lt 10 我
  • Tensorflow 2.3:AttributeError:“Tensor”对象没有属性“numpy”

    我想加载借用的文本文件here 其中每一行代表一个 json 字符串 如下所示 overall 2 0 verified true reviewTime 02 4 2014 reviewerID A1M117A53LEI8 asin 750
  • Web请求标头的顺序重要吗?

    我正在发出 POST 请求以将图片上传到网站 页面中有一个FileUpload和一个input textBox 在fiddler中我发现页面正在使用Multipart Post请求模式发送一些数据 Content Disposition m
  • CloudWatch 警报:待确认

    我使用 CloudFormation 模板创建了一个 CW 警报 如下所示 MyAlarm Type AWS CloudWatch Alarm DependsOn CodePipelineSNSTopic Properties Action
  • 如何配置nextjs 9和ant design less的兼容性?

    升级后react react dom and nextjs发生此错误 发生构建错误 home lenovo node modules antd lib style index css 7 身体 语法错误 意外的标记 在 Module com
  • ASP.NET 全局错误处理程序中的 WebMethod:如何捕获 AJAX POST 请求中传递的值

    换句话说 使用 HttpContext 我如何检索传递给 WebMethod 什么时候在全局错误处理程序中 Kovu 给出了一个很好的例子如何做一个全局错误陷阱来抓取 WebMethod Global asax 中的错误 我认为他是从那里得