实践总结

本次基于对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. sqlserver释放内存

    create procedure sp_clearmemasbegin dbcc freeproccache dbcc freesessioncache dbcc freesystemcache('a ...

  2. 使用 宝塔面板快速部署Java项目

    环境描述: 服务器系统:CentOS7 64位操作系统 面板版本:宝塔6.9.4 Nginx版本:Nginx 1.16 Tomcat版本:Tomcat7 JDK版本:1.8.0_121 环境部署就不用 ...

  3. android TranslateAnimation动画执行时的坐标获取。

    android 的Tween动画并不会改变控件的属性值,比如以下测试片段: 定义一个从屏幕右边进入,滚动到屏幕左边消失的一个TranslateAnimation动画: <?xml version ...

  4. cvc-complex-type.2.4.c: The matching wildcard is strict, but no declaration can be found for element 'mongo:mongo-client'.

    cvc-complex-type.2.4.c: The matching wildcard is strict, but no declaration can be found for element ...

  5. https总结

    http与https不能互相发送ajax请求,因为跨域了. http页面请求https静态资源可以,但是https请求http静态资源会提示错误. 总之,宽松的可以请求严格的,但是严格的不能请求宽松的 ...

  6. vue 简易toDoList

    vue+bootstrap简易响应式任务管理表: <!DOCTYPE html> <html> <head> <meta charset="UTF- ...

  7. 【06】Vue 之 组件化开发

    组件其实就是一个拥有样式.动画.js逻辑.HTML结构的综合块.前端组件化确实让大的前端团队更高效的开发前端项目.而作为前端比较流行的框架之一,Vue的组件和也做的非常彻底,而且有自己的特色.尤其是她 ...

  8. 拖动层 拖动div 封装js 貌似不兼容FF,郁闷

    原文发布时间为:2009-12-02 -- 来源于本人的百度文章 [由搬家工具导入] <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Tran ...

  9. Linux Mint---安装篇

    先前接触过Debian6,埋头折腾已经是好几年前的事情了,后来就放下了,现在工作之余时间比较多,正好debian8.1出来了,于是乎装了个debian用,结果,自己其实还是一个菜蛋而已,连软件源怎么设 ...

  10. [论文]Clustering-Based Ensembles as an Alternative to Stacking

    Clustering-Based Ensembles as an Alternative to Stacking 作者:Anna Jurek, Yaxin Bi, Shengli Wu, and Ch ...