实践总结

本次基于对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进行捕获,代码示例如下:

try{…}
catch (WebException ex)
{
HttpWebResponse resp = (HttpWebResponse)ex.Response;
Stream receiveStream = resp.GetResponseStream();
Encoding encode = System.Text.Encoding.GetEncoding("utf-8");
StreamReader readStream = new StreamReader(receiveStream, encode);
Char[] read = new Char[256];
int count = readStream.Read(read, 0, 256);
while (count > 0)
{
output += new String(read, 0, count);
count = readStream.Read(read, 0, 256);
}
readStream.Close();
resp.Close();
}

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

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

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

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

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

<!-- Web.Config 配置文件 -->
<configuration>
<system.web>
<customErrors mode="Off"/>
</system.web>
</configuration>

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

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

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

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

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

解决方法

解决办法1

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

<configuration>
<system.web>
<pages validateRequest="false" />
</system.web>
</configuration>

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

<system.web>
<httpRuntime requestValidationMode="2.0" />
<pages validateRequest="false"/>
</system.web>

解决办法3

此方法不需要置validateRequest=false

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

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

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

代码示例如下:

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

推荐使用:方法3

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

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

分析过程

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

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

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

解决方法

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

FileStream fs = new FileStream(url, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
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. [python][django学习篇][9]设计正在博客视图(3)

    需求: 真正的首页视图函数,当用户访问我们的博客首页时,他将看到我们发表的博客文章列表,就像 演示项目 里展示的这样.t https://docs.djangoproject.com/en/1.10/ ...

  2. poj2002 hash+邻接表优化Squares

    Squares Time Limit: 3500MS   Memory Limit: 65536K Total Submissions: 17487   Accepted: 6643 Descript ...

  3. vmware安装centos7 安装redis windows7访问redis

    1.在windows7中安装vmware 2.在vmware中安装centos7 3.禁用centos7自带的firewalld.service 4.安装iptables防火墙 5.安装Redis 3 ...

  4. diea

    http://name.vip.int ellig.top/name

  5. cf 853 A planning [贪心]

    题面: 传送门 思路: 一眼看得,这是贪心[雾] 实际上,我们要求的答案就是sigma(ci*(ti-i))(i=1~n),这其中sigma(ci*i)是确定的 那么我们就要最小化sigma(ci*t ...

  6. javascript new关键字做了什么

    基本过程 1.创建一个空对象2.空对象的原型指向其构造函数的原型属性3.执行构造函数,且构造函数的this指向该对象4.判断构造函数返回值类型,若为值类型,返回空对象本身,若为引用类型,返回这个引用类 ...

  7. 一个javascript继承和使用的例子

    继承可以帮助我们实现代码的重用,把对象的属性写入构造函数,对象的方法写入原型后,以下例子演示继承的使用: 示例的css和js在后 父实例,得到一个间隔1s的轮播: <!DOCTYPE html& ...

  8. jquery - 设置/获取内容和属性

    一般我们会遇到给某个元素添加或更改原有的文字: 1. 设置/获取内容 - text().html() 以及 val() 设置内容常用的三个方法: text() - 设置或返回所选元素的文本内容 htm ...

  9. Secure services with TLS ---Docker配置https

    官方文档:https://docs.docker.com/ee/ucp/interlock/usage/tls/

  10. 洛谷 [P3620] 数据备份

    贪心神题 首先我们发现一个显然的贪心策略,连接相邻两个写字楼总是更优. 所以本题就变成了数轴上一堆点,要选 k 个彼此不相邻的区间,使得区间长度最小 对于 10000 的数据来说,我们可以用 DP 解 ...