实践总结

本次基于对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. JVM虚拟机系列(二)虚拟机的逻辑结构

    这个节日,终于把之前看的断断续续的JVM看的差不多了,在这里做一份笔记吧. JVM支持的数据类型: JVM运行时的数据区:

  2. 一些echarts的基本图形

    先拿一个图形渲染过程举例 引用处 <bar ref="ARPUChart" v-if="ARPUChart" style="width:500p ...

  3. 第四篇:python基础_4

    本篇内容 名称空间与作用域 闭包函数 装饰器 迭代器 生成器 三元表达式 列表解析 生成器表达式 一. 名称空间与作用域 1.名称空间 存放名字的地方,准确的说名称空间是存放名字与变量值绑定关系的地方 ...

  4. 大素数判断和素因子分解(miller-rabin,Pollard_rho算法)

    #include<stdio.h> #include<string.h> #include<stdlib.h> #include<time.h> #in ...

  5. 一个 Java 的 Socket 服务器和客户端通信的例子

    一个 HelloWord 级别的 Java Socket 通信的例子.通讯过程: 先启动 Server 端,进入一个死循环以便一直监听某端口是否有连接请求.然后运行 Client 端,客户端发出连接请 ...

  6. [luoguP2587] [ZJOI2008]泡泡堂(贪心)

    传送门 贪心,很像田忌赛马那样,但是因为有平局加一分导致那样的贪心不好处理. 先将两个数组从小到大排序. 比较a最大和b最大,如果a比b大,那么直接赢掉 否则 比较a最小和b最小,如果a比b大,那么直 ...

  7. BZOJ1562 [NOI2009]变换序列 【KM算法】

    题目 输入格式 输出格式 输入样例 5 1 1 2 2 1 输出样例 1 2 4 0 3 提示 30%的数据中N≤50: 60%的数据中N≤500: 100%的数据中N≤10000. 题解 每个位置可 ...

  8. MyEclipse生成get/set注释

    我的外网链接 http://yezi-0016.iteye.com/blog/2290421

  9. bzoj1040 基环树上dp

    [bzoj1040][ZJOI2008]骑士 2014年2月26日5,2040 Description Z国的骑士团是一个很有势力的组织,帮会中汇聚了来自各地的精英.他们劫富济贫,惩恶扬善,受到社会各 ...

  10. [Linux]方便openmp等程序的类似编译

    因为总是打参数例如-fopenmp或者-lGL等等有些麻烦,所以特地写一个可以使用的bash文件用来执行简单的操作 首先在.profile中添加 if [ -d "$HOME/bin&quo ...