实践总结

本次基于对500错误定位为例,给大家讲解整个分析过程与解决方法。

1.本次实践为HTTP错误状态码定位提供一个高效、精确的定位方式,不仅仅局限于500错误。

2.针对500错误本身,可以基于问题出现频率和下述经验值将问题进行归类,缩小定位范围。

问题描述1:单个调用接口返回500错误。

分析过程

1、 首先,弄清什么是“HTTP请求状态码500”?

(1)500 (Internal Server Error)是内部服务器错误。

(2)500 (SC_INTERNAL_SERVER_ERROR) 是常用的“服务器错误”状态。该状态经常由CGI程序引起。也可能由无法正常运行的或返回头信息格式不正确的servlet引起。

2、其次,如何捕获异常信息?

(1)通常我们使用WebException进行捕获,代码示例如下:

  1. try{…}
  2. catch (WebException ex)
  3. {
  4. HttpWebResponse resp = (HttpWebResponse)ex.Response;
  5. Stream receiveStream = resp.GetResponseStream();
  6. Encoding encode = System.Text.Encoding.GetEncoding("utf-8");
  7. StreamReader readStream = new StreamReader(receiveStream, encode);
  8. Char[] read = new Char[256];
  9. int count = readStream.Read(read, 0, 256);
  10. while (count > 0)
  11. {
  12. output += new String(read, 0, count);
  13. count = readStream.Read(read, 0, 256);
  14. }
  15. readStream.Close();
  16. resp.Close();
  17. }

(2)通常我们会发现我们捕获到的内容如下:

权限问题 标记的“mode”属性设置为“Off”。

说明: 服务器上出现应用程序错误。此应用程序的当前自定义错误设置禁止查看应用程序错误的详细信息。

详细信息: 若要使他人能够从本地服务器计算机上查看此特定错误信息的详细信息,请在位于当前 Web 应用程序根目录下的“web.config”配置文件中创建一个 标记。然后应将此 标记的“mode”属性设置为“RemoteOnly”。若要使他人能够在远程计算机上查看详细信息,请将“mode”设置为“Off”。

由于我们更多情况下是远程调用接口,所以需在web.config文件中做如下配置:

  1. <!-- Web.Config 配置文件 -->
  2. <configuration>
  3. <system.web>
  4. <customErrors mode="Off"/>
  5. </system.web>
  6. </configuration>

获取IIS日志查看权限后,基于第(1)种方法再次捕获内容如下:

…从客户端中检测到有潜在危险的Request.Form值…

.Net中,Request时如果出现有HTML或Javascript等字符串时,系统会认为是危险性值,触发System.Web.HttpRequestValidationException异常,提示信息大概如下:

异常信息: System.Web.HttpRequestValidationException: 从客户端……中检测到有潜在危险的 Request.Form 值。

说明: 请求验证过程检测到有潜在危险的客户端输入值,对请求的处理已经中止。该值可能指示危及应用程序安全的尝试,如跨站点的脚本攻击。通过在 Page 指令或 配置节中设置 validateRequest=false 可以禁用请求验证。但是,在这种情况下,强烈建议应用程序显式检查所有输入。

解决方法

解决办法1

在.aspx文件头中加入以下语句:

  1. <configuration>
  2. <system.web>
  3. <pages validateRequest="false" />
  4. </system.web>
  5. </configuration>

备注:若基于.NET 2.0版本可以使用上述配置。若基于.NET 4.0版本,则配置如下:

  1. <system.web>
  2. <httpRuntime requestValidationMode="2.0" />
  3. <pages validateRequest="false"/>
  4. </system.web>

解决办法3

此方法不需要置validateRequest=false

在当前页面添加Page_Error()函数,来捕获页面处理过程中发生的而没有处理的异常。然后给用户一个合理的提示信息。

如果当前页面没有Page_Error(),这个异常将会送到Global.asax的Application_Error()来处理,你也可以在那里写通用的异常报错处理函数。

如果两个地方都没有写异常处理函数,才会显示这个默认的报错页面。

代码示例如下:

  1. protected void Page_Error(object sender, EventArgs e)
  2. {
  3. Exception ex = Server.GetLastError();
  4. if (ex is HttpRequestValidationException)
  5. {
  6. Response.Write("请您输入合法字符串。");
  7. Server.ClearError(); // 如果不ClearError()这个异常会继续传到Application_Error()。
  8. }}

推荐使用:方法3

推荐理由:在不以牺牲IIS安全性为前提去解决现有问题

问题描述2:单个调用接口返回200,当并发调用返回500。

分析过程

与上述一致,但捕获到的内容为:

System.IO.IOException: 文件“E:\va\2013031510.log”正由另一进程使用,因此该进程无法访问该文件。

备注:大多数情况下,问题2不是一开始就产生,而是并发调用一段时间后才出现。

解决方法

使用共享锁,赋予文件读和写权限,代码示例如下:

  1. FileStream fs = new FileStream(url, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
  2. StreamReader sr = new StreamReader(fs, System.Text.Encoding.Default);

HTTP错误状态码定位与解决的更多相关文章

  1. js调试系列: 源码定位与调试[基础篇]

    js调试系列目录: - 如果看了1, 2两篇,你对控制台应该有一个初步了解了,今天我们来个简单的调试.昨天留的三个课后练习,差不多就是今天要讲的内容.我们先来处理第一个问题:1. 查看文章下方 推荐 ...

  2. Foxmail 登录 qq 账号时无法登录 提示我们设置了独立密码或使用授权码登录的解决方法

    Foxmail 登录 qq 账号时无法登录  提示我们设置了独立密码或使用授权码登录的解决方法 1.首先我们设置我们邮箱的类型如下图所示 2.打开网页版的qq邮箱  在设置--->账户---&g ...

  3. 运维-nginx +php 错误状态码说明

    常用 nginx 错误码: 正常: 200 正常访问 301  永久跳转访问 302 临时跳转访问 常见错误状态码: 400  ,经常有服务器自己调用 自己的情况 用报400,如高防调用高防,或者lv ...

  4. centos7.5离线安装Docker及容器运行报OCI runtime create failed 问题定位与解决

    前言 接上篇 <记一次centos挂载ceph存储的坑> 服务器重做了centos7.5版本的操作系统,剩下就是安装docker,考虑yum安装耗时较长,我一般都是直接安装二进制版本doc ...

  5. sqlserver错误状态码解释

    Code Error Message 0 操作成功完成. 1 功能错误. 2 系统找不到指定的文件. 3 系统找不到指定的路径. 4 系统无法打开文件. 5 拒绝访问. 6 句柄无效. 7 存储控制块 ...

  6. http请求常见错误状态码

    一.HTTP 错误 400 400 请求出错 由于语法格式有误,服务器无法理解此请求.不作修改,客户程序就无法重复此请求. 原因:(调用方接口方法的实参和服务器接口方法的形参不一致) 1.前端提交数据 ...

  7. Android源码编译出错解决办法

    编译环境:Ubuntu12.04 64位 Android源码:Android 4.3 以下问题是笔者亲自碰到,通过网上查询整合在一起的. 1.error while loading shared li ...

  8. MyElipes遇到 source not found解决方案(查看.class文件源码一劳永逸的解决方法)

    在用Myeclipse 或者是eclipse进行开发时候经常遇到这个问题. File class editor source not found 问题.原因很简单,就是因为这是一个源码包,相应的没有编 ...

  9. (高德地图)marker定位 bug 解决总结

    项目背景: 一个项目bug,项目中用到高德地图,默认打开页面会生成一个marker(下图红色icon),然后用户拖动marker到想要的位置,并且保存. 用户反映定位不准确,在当前页面编辑的位置,到后 ...

随机推荐

  1. [oldboy-django][6其他]微信二维码扫码登录注册

    http://blog.csdn.net/maerdym/article/details/46380309 http://blog.csdn.net/jiang1013nan/article/deta ...

  2. 遇到的python3 不兼容 python2的地方

    python3中执行以下代码 >>> import subprocess >>> p=subprocess.Popen('ls',shell=True,stdout ...

  3. SQL2008非域环境直接使用WINDOWS登录的镜像设置

    1.检查主库是否为完全备份 2.将数据库备份出来还原到同步库上(完整备份和事务日志分两次备份到同一个备份文件中,然后拷贝到同步机上) 3.用证书太麻烦了,我们直接用两个windows认真的账户 不分主 ...

  4. react输入框输入中文bug

    一般来说,react上我们都会用change事件去处理input的输入,但这样就导致一个问题,在输入中文的时候,我们还没输入完成就会触发change事件,这样显然不是理想状况. 那么,怎么解决这个问题 ...

  5. 糗事百科python爬虫

    # -*- coding: utf-8 -*- #coding=utf-8 import urllib import urllib2 import re import thread import ti ...

  6. iOS之UITraitCollection

    UITraitCollection 为表征 size class 而生,用来区分设备.你可以在它身上获取到足以区分所有设备的特征. UITraitEnvironment 协议.UIContentCon ...

  7. 【HDOJ5996】dingyeye loves stone(Nim游戏)

    题意:dingyeye喜欢和你玩石子游戏.dingyeye有一棵n个节点的有根树,节点编号为0到n−1,根为0号节点. 游戏开始时,第i个节点上有a[i]个石子.两位玩家轮流操作,每次操作玩家可以选择 ...

  8. Ncut matlab 代码bug 修复

    先说平台: win7 x64,matlab 2012a x64,亲测运行. ncut 是个图像切割方法,以后再回顾具体算法吧,网上很多流程的是Jianbo Shi 这位2000年写的,名字应该是:Da ...

  9. boost 库的下载和编译_Visual Studio 2013(转)

    原文转自 http://blog.csdn.net/lp310018931/article/details/47791143 原文转自 http://m.blog.csdn.net/article/d ...

  10. eWebEditor不支持IE7以上版本Bug修改

    修改: \Include\Editor.js //把此行 if (element.YUSERONCLICK) eval(element.YUSERONCLICK + "anonymous() ...