客户端

客户端的作用就是捕获未处理异常, 发送异常到服务端。 关于捕获未处理异常的方法参考 http://www.cnblogs.com/youring2/archive/2012/04/25/2469974.html  http://www.cnblogs.com/eaglet/archive/2009/02/17/1392191.html 这两篇博客。
总结下来对于web程序来说, 捕获未处理异常有两种方式:
1. 定义一个HttpModule, 在这个module的context_Error方法中来捕获未处理的异常。 
2. 在Global.asax中有一个Application_Error的方法, 当程序发生未处理异常的时候, 会调用这个方法。 
对于以上两种方式, 以上两篇博客也做了对比, 对异常的捕获, HttpModule会优于Global,同时从编程的角度来说, 如果使用Global, 那就意味着代码侵入。 所以最后决定采用了HttpModule的方式。
public class ErrorLogModule : IHttpModule
{ #region IHttpModule Members public void Dispose()
{
} public void Init(HttpApplication context)
{
context.Error += context_Error;
} #endregion private void context_Error(object sender, EventArgs e)
{
HttpApplication application = (HttpApplication) sender;
ClientErrorEntity errorMessage = new ClientErrorEntity(application.Server.GetLastError().GetBaseException(),
application.Context);
SendErrorEntity.SendError(errorMessage);
}
}
异常信息组装。 
 public ClientErrorEntity(Exception exception, HttpContext httpContext)
{
Id = Guid.NewGuid().ToString("N"); MachineName = Environment.MachineName;
Ip = Common.GetLocalIp();
ExceptionType = exception.GetType().FullName;
ExceptionMessage = exception.Message;
ExceptionSource = exception.Source;
ExceptionDetail = exception.ToString();
DateTime = DateTime.Now;
HttpException httpException = exception as HttpException;
if (httpException != null)
{
HttpStatusCode = httpException.GetHttpCode();
} if (httpContext != null)
{
HttpRequest request = httpContext.Request;
RequestUrl = request.Url.AbsoluteUri;
ServerVariables = Common.ConvertCollectionToDictionary(request.ServerVariables);
QueryString = Common.ConvertCollectionToDictionary(request.QueryString);
Form = Common.ConvertCollectionToDictionary(request.Form);
Cookies = Common.ConvertCollectionToDictionary(request.Cookies);
}
Type = ;
}
这里实现了异常信息的发送,为了避免影响主逻辑, 采用了异步的方式。 注意一个问题, 对于API的地址, 我们采用的硬编码的方式, 当然正式环境为了避免单点, 应该采用域名的方式, 然后通过负载均衡在在多台服务器中选择。 如果仅仅有一台服务器, 那我们要将这个地址放在配置文件中, 一旦地址发生了变化,可以方便我们更改。  
  public static void SendError(ClientErrorEntity errorMessage)
{
try
{
string jsonstr = JsonConvert.SerializeObject(errorMessage);
//异步, 确保不会影响主逻辑
sendPostdelegate.BeginInvoke("http://192.168.16.39:90/api/Error", jsonstr, ContentType.Json, ,
Encoding.UTF8,
Encoding.UTF8, Response, sendPostdelegate); //这里请求地址 建议改为域名的方式, 如果没有域名,建议请求地址和webtoken类似为可配置
}
catch (Exception exception)
{
Common.Log("错误信息上传失败:" + exception.Message);
}
}
为了标示异常是从哪个网站发出的, 我们会对每个网站分配一个token,token会随异常信息一起发送到服务端。 
 <configSections>
<section name="WebWarningSetting" type="System.Configuration.SingleTagSectionHandler"/>
</configSections>
<WebWarningSetting WebToken="1E8C46FC74DC41569EFF63C92A7A4087"/>

服务端API

服务端API主要功能是接收异常信息,考虑到性能问题, 并没有将异常信息直接入库,而是将异常信息放入到Redis的List中,  因为提供的驱动中Redis的List的Value并不支持对象, 所以这里采用分开存放的方法, 将ErrorEntity.Id放入到队列中, ErrorEntity则以普通的方式set到Redis中, 在获取数据的时候,从队列中获取到ErrorEntity.Id , 这样取出来的Id确保顺序不会变, 再根据这个Id, 通过get取出实体。这种方法其实还有待考虑, 虽然List不支持复杂Value, 但是通过json序列化,我们还是可以直接将ErrorEntity放入到List中。
  public HttpResponseMessage Post([FromBody]ErrorEntityDto errorEntity)
{
if (errorEntity != null && !string.IsNullOrWhiteSpace(errorEntity.Id))
{
if (RedisHelper.EnqueueItemOnList("ErrorEntityQueue", errorEntity.Id)) //先将ErrorEntity.Id放入到队列中,确保顺序不会变
{
if (RedisHelper.Set(errorEntity.Id, errorEntity)) //将实体添加到Redis中
{
return ReturnPlainText("ok");
}
return ReturnPlainText("set error");
}
return ReturnPlainText("add item to list error");
}
return ReturnPlainText("modle error");
}

.Net分布式异常报警系统-客户端及服务端API的更多相关文章

  1. WCF客户端获取服务端异常[自定义异常]

    引言 经过不断的摸索,询问/调试,终于学会了关于WCF客户端与服务端之间异常的处理机制,在此来记录自己的成果,用于记录与分享给需要的伙伴们. 首先感谢[.NET技术群]里群主[轩]的大力帮助,如有需要 ...

  2. .Net分布式异常报警系统-简介

    系统简介 分布式异常报警系统就是收集系统运行过程中产生的未处理异常,检查系统运行的状态,并将异常信息统一发送到服务端,由服务端将信息通知到相关的责任人.  问题 我们在项目开发中可能遇到以下几个问题: ...

  3. 客户端与服务端的事件watcher源码阅读

    watcher存在的必要性 举个特容易懂的例子: 假如我的项目是基于dubbo+zookeeper搭建的分布式项目, 我有三个功能相同的服务提供者,用zookeeper当成注册中心,我的三个项目得注册 ...

  4. C# TCP实现多个客户端与服务端 数据 与 文件的传输

    C#菜鸟做这个东东竟然花了快三天的时间了,真是菜,菜,菜--- 下面是我用C#写的 一个简单的TCP通信,主要的功能有: (1) 多个客户端与服务器间的数据交流 (2)可以实现群发的功能 (3)客户端 ...

  5. Android客户端与服务端交互之登陆示例

    Android客户端与服务端交互之登陆示例 今天了解了一下android客户端与服务端是怎样交互的,发现其实跟web有点类似吧,然后网上找了大神的登陆示例,是基于IntentService的 1.后台 ...

  6. java客户端与服务端交互通用处理 框架解析

    一.综述 java 客户端与服务端交互过程中,采用NIO通讯是异步的,客户端基本采用同一处理范式,来进行同异步的调用处理. 处理模型有以下几个要素: 1. NIO发送消息后返回的Future 2. 每 ...

  7. Oracle Tuxedo工作站客户端与服务端的样例程序

    服务端代码: #include <stdio.h> #include <stdlib.h> #include <string.h> #include <cty ...

  8. Socket通信客户端和服务端代码

    这两天研究了下Socket通信,简单实现的客户端和服务端代码 先上winfrom图片,客户端和服务端一样 服务端代码: using System; using System.Collections.G ...

  9. java在线聊天项目1.1版 ——开启多个客户端,分别实现注册和登录功能,使用客户端与服务端信息request机制,重构线程,将单独的登录和注册线程合并

    实现效果图: eclipse项目中初步整合之前的各个客户端和服务端的窗口与工具类,效果如下图: 已将注册服务器线程RegServer功能放到LoginServer中,使用客户端与服务端的request ...

随机推荐

  1. 0004 plsql的安装

    PL/SQL是Oracle开发的主要工具,安装很简单,在官网 “https://www.allroundautomations.com/plsqldev.html” 选择合适的版本,也有多国语言包,下 ...

  2. MVC Ajax Helper或jQuery异步方式加载部分视图

    Model: namespace MvcApplication1.Models { public class Team { public string Preletter { get; set; } ...

  3. iOS 懒加载不起作用的原因

    在.m类中定义了一共strong属性,用懒加载getter方式去处理,发现用的时候无论如何属性都是null,调试后,发现根本没进getter方法. (ps:懒加载,又称为延迟加载.说的通俗一点,就是在 ...

  4. Log4Net根据不同的Logger名称,生成日志文件到不同的地方。

    1.定义日志记录类 1: public class Log4NetLogger : ISystemLogger 2: { 3: static log4net.ILog securityLogger = ...

  5. 用PS设计等高线效果的背景图片

    有些简单的单网页,如果利用等高线效果的背景图片,再配合合适的背景色,能达到绚丽的效果.如下图所示: 本文就介绍该等高线效果的背景图片是如何制作的.Follow Me!!!! 1.新建文档,尺寸:100 ...

  6. shell tips

    1.shopt 命令可以设置shell的可选参数 shopt [-psu] [optname...] -s 开启某个选项 -u 关闭某个选项 -p 列出所有可设置的选项 其中开启extglob选项,s ...

  7. C# 格式化小总结

    C#中几个常用的格式化标识符 C或c Currency 货币格式 D或d Decimal 十进制格式(十进制整数,不要和.Net的Decimal数据类型混淆了) E或e Exponent 指数格式 F ...

  8. 分布式系统理论之Quorum机制

    一,Quorum机制介绍 在分布式系统中有个CAP理论,对于P(分区容忍性)而言,是实际存在 从而无法避免的.因为,分布系统中的处理不是在本机,而是网络中的许多机器相互通信,故网络分区.网络通信故障问 ...

  9. Vijos1680距离/openjudge2988计算字符串的距离[DP]

    描述 设有字符串X,我们称在X的头尾及中间插入任意多个空格后构成的新字符串为X的扩展串,如字符串X为”abcbcd”,则字符串“abcb_c_”,“_a_bcbcd_”和“abcb_c_”都是X的扩展 ...

  10. CSS中单位px和em,rem的区别

    PX特点: 1 IE无法调整那些使用px作为单位的字体大小: 2. 国外的大部分网站能够调整的原因在于其使用了em或rem作为字体单位: 3. Firefox能够调整px和em,rem,但是96%以上 ...