您的位置:首页 > 编程语言 > ASP

asp.net API 实时日志查看功能

2012-11-27 14:55 459 查看
< ![CDATA[有时候些mvc api .当 参数传进来后。进行的那些操作。一般写log。比较麻烦。不方便
现在介绍下,实时显示 log的一个方法

首先 ,需要一个object SignalR 自行 去git下载。

vs的packing搜不到。

这个其实就是 websocket

思路就是 :

1--路由进入配置。

public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
//
config.Services.Replace(typeof(ITraceWriter), new DynamicTrace());
}
}


2.新建一个虚拟类 ,相当于枢纽,广播日志到客户端

[HubName("trace")]
public class TraceHub : Hub
{}


3.新建一个允许任何类继承的 signalrbase

public abstract class SignalRBase<T> where T : IHub
{
private Lazy<IHubContext> hub = new Lazy<IHubContext>(() => GlobalHost.ConnectionManager.GetHubContext<T>());

protected IHubContext Hub
{
get { return hub.Value; }
}
}


4.记录当时的时间,访问的方法,等。实现类。

public class DynamicTrace : SignalRBase<TraceHub>, ITraceWriter
{
public void Trace(HttpRequestMessage request, string category, TraceLevel level, Action<TraceRecord> traceAction)
{
if (level != TraceLevel.Off)
{
TraceRecord record = new TraceRecord(request, category, level);
traceAction(record);
Log(record);
}
}

private void Log(TraceRecord record)
{
var message = new StringBuilder();

message.AppendMessage(record.Level.ToString().ToUpper());
message.AppendMessage(DateTime.Now.ToString());

if (record.Request != null)
message.AppendMessage(record.Request.Method.ToString(), notEmpty).AppendMessage(record.Request.RequestUri.ToString(), notEmpty);

message.AppendMessage(record.Category, notEmpty).AppendMessage(record.Operator, notEmpty)
.AppendMessage(record.Operation).AppendMessage(record.Message, notEmpty);

if (record.Exception != null)
message.AppendMessage(record.Exception.GetBaseException().Message, notEmpty);

Hub.Clients.All.logMessage(message.ToString());
}

Func<string, bool> notEmpty = (text) => !string.IsNullOrWhiteSpace(text);
}


5. 记录日志的方法方法,字符串拼加

public static StringBuilder AppendMessage(this StringBuilder sb, string text, Func<string, bool> predicate = null)
{
if (predicate != null)
{
if (predicate(text))
{
sb.Append(" ");
sb.Append(text);
}
}
else
{
sb.Append(" ");
sb.Append(text);
}

return sb;
}


利用signalr 广播。实时把api访问的log广播给客户端。

SignalR 本来就是一个websocket 封装

然后,这些日志 将在 页面上输出

所以最后新建一个HTML,连接我们刚才建的广播中心。接收日志

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
</head>
<body>
<ul id="messages"></ul>
<script type="text/javascript" src="Scripts/jquery-1.7.1.js"></script>
<script type="text/javascript" src="Scripts/jquery.signalR-1.0.0-alpha2.js"></script>
<script type="text/javascript" src="signalr/hubs"></script>
<script type="text/javascript">
$(function () {
hub = $.connection.trace;
hub.client.logMessage = function (data) {
$('#messages').prepend('<li>' + data + '</li>');
};
$.connection.hub.start();
});
</script>
</body>


看下图:



左边的我请求了个api 。地址。右边我新建的html 实时的接收广播 打印出来。

不擅长写blog。。将就看看吧。

可以参考一下文章

/article/4926772.html (在 Asp.NET MVC 中使用 SignalR 实现推送功能)

]]>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: