WMSWebServiceExtension 使用,支持压缩
using System;
using System.Collections.Generic;
using System.IO.Compression;
using System.Diagnostics;
using System.Text;
using System.IO;
using System.Net;
using System.Text.RegularExpressions;
using System.Web.Services.Protocols;
using System.Windows.Forms;
using Best.Utility;
using System.Reflection;
using Best.Utility.BestLog;
namespace Best.WMS.IService
{
public class WMSWebServiceExtension : SoapExtension
{
private Stream _oldStream;
private Stream _newStream;
private SoapMessage _curSoapMessage;
private DateTime _dtBeginSerializeTime = new DateTime(); //开始序列化时间
private DateTime _dtEndSerializeTime = new DateTime(); //结束序列化时间
private DateTime _dtBeginDeserializeTime = new DateTime(); //开始反序列化时间
private DateTime _dtEndDeserializeTime = new DateTime(); //结束反序列化时间
private string _udf6;
private const double ThresholdTime = 10 * 1000; //时间过长阀值,10秒
private readonly object _obj = new object();
public override void ProcessMessage(SoapMessage message)
{
lock (_obj)
{
_curSoapMessage = message;
switch (message.Stage)
{
case SoapMessageStage.BeforeSerialize:
_dtBeginSerializeTime = DateTime.Now;
break;
case SoapMessageStage.AfterSerialize:
_dtEndSerializeTime = DateTime.Now;
AfterSerialize(message);
break;
case SoapMessageStage.BeforeDeserialize:
_dtBeginDeserializeTime = DateTime.Now;
BeforeDeserialize(message);
break;
case SoapMessageStage.AfterDeserialize:
_dtEndDeserializeTime = DateTime.Now;
GetUdf6();
SoapLogHelper.LogInfo(GetLogLineStr());
break;
default:
throw new Exception("invalid stage");
}
}
}
public override Stream ChainStream(Stream stream)
{
lock (_obj)
{
_oldStream = stream;
_newStream = new MemoryStream();
return _newStream;
}
}
//序列化请求之后(此时可对数据进行压缩)
public void AfterSerialize(SoapMessage message)
{
_newStream.Position = 0;
//if (string.IsNullOrEmpty(ClientConfig.IsWhDefaul))
//{
// Copy(_newStream, _oldStream);
//}
//else
{
Copy2(_newStream, _oldStream);
}
}
//反序列化响应之前(此时可对数据进行解压缩)
public void BeforeDeserialize(SoapMessage message)
{
Copy(_oldStream, _newStream);
_newStream.Position = 0;
}
void Copy(Stream from, Stream to)
{
TextReader reader = new StreamReader(from);
TextWriter writer = new StreamWriter(to);
string strContent = reader.ReadToEnd();
writer.WriteLine(strContent);
writer.Flush();
}
void Copy2(Stream from, Stream to)
{
var zipStream = new GZipStream(to, CompressionMode.Compress);
var data = StreamToBytes(from);
zipStream.Write(data, 0, data.Length);//将数据压缩并写到基础流中
zipStream.Close();
}
/// <summary>
/// 将 Stream 转成 byte[]
/// </summary>
public byte[] StreamToBytes(Stream stream)
{
byte[] bytes = new byte[stream.Length];
stream.Read(bytes, 0, bytes.Length);
// 设置当前流的位置为流的开始
stream.Seek(0, SeekOrigin.Begin);
return bytes;
}
/// <summary>
/// 获取IP地址
/// </summary>
private string GetHostIP()
{
try
{
return new IPAddress(Dns.GetHostByName(Dns.GetHostName()).AddressList[0].Address).ToString();
}
catch
{
return "";
}
}
private string GetLogLineStr()
{
ParameterInfo[] piList = _curSoapMessage.MethodInfo.Parameters;
string parameter = "";
for (int i = 0; i < piList.Length; i++)
{
if (i == 0)
{
parameter += piList[i].ParameterType.Name;
}
else
{
parameter += ", " + piList[i].ParameterType.Name;
}
}
var sb = new StringBuilder();
TimeSpan totalSpan = _dtEndDeserializeTime.Subtract(_dtBeginSerializeTime); //服务总时间
double totalTime = totalSpan.TotalMilliseconds;
TimeSpan serialize = _dtEndSerializeTime.Subtract(_dtBeginSerializeTime); //序列化消耗时间
double serializeTime = serialize.TotalMilliseconds;
string serializeTimeVal = String.Format("{0:F}", serializeTime) + "ms";
TimeSpan deserialize = _dtEndDeserializeTime.Subtract(_dtBeginDeserializeTime); //序反列化消耗时间
double deserializeTime = deserialize.TotalMilliseconds;
string deserializeTimeVal = String.Format("{0:F}", deserializeTime) + "ms";
double udf6;
double serverTime = double.TryParse(_udf6, out udf6) ? udf6 : 0;
string serverTimeVal = String.Format("{0:F}", serverTime) + "ms"; //服务端消耗时间
double netWorkTime = totalTime - serializeTime - deserializeTime - serverTime;
string netWorkTimeVal = String.Format("{0:F}", netWorkTime) + "ms"; //网络消耗时间
sb.Append("IP address: " + GetHostIP() + "\r\n");
if (ClientService.CurrentUserInfo == null)
{
sb.Append("User: " + "Null" + "\r\n");
sb.Append("Org: " + "Null" + "\r\n");
}
else
{
sb.Append("User: " + ClientService.CurrentUserInfo.userName + "\r\n");
sb.Append("Org: " + ClientService.CurrentOrgName + "\r\n");
}
sb.Append("WebService: " + _curSoapMessage.Url + "\r\n");
sb.Append("WebMethod: " + _curSoapMessage.MethodInfo.Name + "(" + parameter + ")" + "\r\n");
sb.Append("InvokeTime: " + _dtBeginSerializeTime.ToString() + "\r\n");
sb.Append("serializeTime: " + serializeTimeVal + "\r\n");
sb.Append("deserializeTime: " + deserializeTimeVal + "\r\n");
sb.Append("ServerTime:" + serverTimeVal + "\r\n");
sb.Append("NetConsumeTime:" + netWorkTimeVal + "\r\n");
if (serializeTime > ThresholdTime)
{
LogTimeOutWarning("序列化消耗时间过长", serializeTime);
}
if (deserializeTime > ThresholdTime)
{
LogTimeOutWarning("序反列化消耗时间过长", deserializeTime);
}
if (serverTime > ThresholdTime)
{
LogTimeOutWarning("服务端返回时间过长", serverTime);
}
return sb.ToString();
}
/// <summary>
/// 记录各个环节超时日志
/// </summary>
private void LogTimeOutWarning(string warningMsg, double time)
{
var udfs = new List<string>
{
string.Format("WebService: {0}", _curSoapMessage.Url),
string.Format("WebMethod: {0}", _curSoapMessage.MethodInfo.Name),
string.Format("{0}:{1}ms", warningMsg, time)
};
try
{
SysLogger.LogWarn(LoggerService.CreateLogMsg(SysLogger.SysLogCode, "WebService", "WMSWebServiceExtension", "LogTimeOutWarning", null, udfs.ToArray()));
}
catch (Exception e)
{
NLogHelper.Warn(e.ToString());
}
}
void GetUdf6()
{
try
{
_newStream.Position = 0;
string soapMessage = new StreamReader(_newStream).ReadToEnd();
if (string.IsNullOrEmpty(soapMessage))
return;
if (soapMessage.Contains("<code>") && soapMessage.Contains("</code>"))
{
//强制更新
var codeArray = Regex.Split(soapMessage, "<code>", RegexOptions.IgnoreCase);
var codeStr = codeArray[1];
var messageCodeArray = Regex.Split(codeStr, "</code>", RegexOptions.IgnoreCase);
var messageCode = messageCodeArray[0];
if (messageCode.Trim() == "ERR_SECURITY_FORCE_RELOAD")
{
var forceExit = new ForceExitForm();
forceExit.ShowDialog();
if (forceExit.DialogResult != DialogResult.OK)
return;
var appFile = Application.StartupPath + "\\" + "Main.exe";
if (File.Exists(appFile))
Process.Start(appFile);
Environment.Exit(0);
}
}
if (!soapMessage.Contains("</udf6>") || !soapMessage.Contains("<udf6>"))
return;
var beforeArray = Regex.Split(soapMessage, "<udf6>", RegexOptions.IgnoreCase);
var firstStr = beforeArray[1];
var afterArray = Regex.Split(firstStr, "</udf6>", RegexOptions.IgnoreCase);
_udf6 = afterArray[0];
}
catch (Exception ex)
{
SysLogger.LogError(LoggerService.CreateLogMsg(SysLogger.SysLogCode, "WebService", "WMSWebServiceExtension", "GetUdf6", ex));
}
}
public override object GetInitializer(LogicalMethodInfo methodInfo, SoapExtensionAttribute attribute)
{
lock (_obj)
{
return DBNull.Value;
}
}
public override void Initialize(object initializer)
{
}
public override object GetInitializer(Type serviceType)
{
lock (_obj)
{
return DBNull.Value;
}
}
}
[AttributeUsage(AttributeTargets.Method)]
public class WMSExtensionAttribute : SoapExtensionAttribute
{
int priority;
public override Type ExtensionType
{
get { return typeof(WMSWebServiceExtension); }
}
public override int Priority
{
get
{
return priority;
}
set
{
priority = value;
}
}
}
}
WMSWebServiceExtension 使用,支持压缩的更多相关文章
- 跨平台的zip文件压缩处理,支持压缩解压文件夹
根据minizip改写的模块,需要zlib支持 输出的接口: #define RG_ZIP_FILE_REPLACE 0 #define RG_ZIP_FILE_APPEND 1 //压缩文件夹目录, ...
- 编译Hadoop 2.7.2支持压缩 转
hadoop Native Shared Libraries 使得Hadoop可以使用多种压缩编码算法,来提高数据的io处理性能.不同的压缩库需要依赖到很多Linux本地共享库文件,社区提供的二进制安 ...
- hadoop对于压缩文件的支持及算法优缺点
hadoop对于压缩文件的支持及算法优缺点 hadoop对于压缩格式的是透明识别,我们的MapReduce任务的执行是透明的,hadoop能够自动为我们 将压缩的文件解压,而不用我们去关心. 如果 ...
- gulp插件实现压缩一个文件夹下不同目录下的js文件(支持es6)
gulp-uglify:压缩js大小,只支持es5 安装: cnpm: cnpm i gulp-uglify -D yarn: yarn add gulp-uglify -D 使用: 代码实现1:压缩 ...
- hadoop对于压缩文件的支持
转载:https://www.cnblogs.com/ggjucheng/archive/2012/04/22/2465580.html hadoop对于压缩格式的是透明识别,我们的MapReduce ...
- Python如何支持读入gz压缩或未压缩文件?
目录 需求 示例代码 笨办法 Pythonic方法 需求 要写一个接口,同时支持压缩和未压缩文件读入 示例代码 笨办法 import os import gzip filename = sys.arg ...
- java nio 写一个完整的http服务器 支持文件上传 chunk传输 gzip 压缩 使用过程 和servlet差不多
java nio 写一个完整的http服务器 支持文件上传 chunk传输 gzip 压缩 也仿照着 netty处理了NIO的空轮询BUG 本项目并不复杂 代码不多 ...
- IIS7 启用GZip压缩
GZip压缩通常会达到70%以上的压缩率,如果是手机Web这无疑会使网站的访问速度大大增加,无论是CSS合并.JS合并.图片合并都不如GZip压缩来得简单直接.如果一个网页是100K,那么启用GZip ...
- Nginx开启GZIP来压缩网页
HTTP协议上的GZIP编码是一种用来改进web应 用程序性能的技术.大流量的WEB站点常常使用GZIP压缩技术来让用户感受更快的速度.这一般是指WWW服务器中安装的一个功能,当有人来访问这个服务器中 ...
随机推荐
- 用户 NT AUTHORITY\NETWORK SERVICE 登录失败 解决方法(转载)
用户 NT AUTHORITY\NETWORK SERVICE 登录失败 解决方法 (MS SQL 2005) Windows server 2003,2008 Web.Config 配置连接sql ...
- mmzb游戏事故分析
最近一次线上更新,老项目挂了,遍地哀嚎,日活跃掉了好多,心痛... 这次维护时,SA为了缩减硬件资源,做了一次数据库迁移.给到开发手上的player db,只有一些索引数据,不带有任一玩家数据.玩家上 ...
- 移动端头像上传AJax input file
jQuery中的Ajax不能支持 input file 需要用ajaxupload.js但是先需要引入jQuery文件 <script src="__PUBLIC__/js/ajaxf ...
- 关于MySQL5.6.25在Win7 64bit下重装后无法启动的解决方法
在重装MySQL5.6.25安装到进行配置的时候,一直在等待服务的启动.如果手动在系统服务启动会提示1067错误,这个错误在网上很常见,然而我试过了很多方法均无法解决. 于是看ProgramData\ ...
- 手动创建Spring项目 Spring framework
之前学习框架一直是看的视频教程,并且在都配套有项目源码,跟着视频敲代码总是很简单,现在想深入了解,自己从官网下载文件手动搭建,就遇到了很多问题记载如下. 首先熟悉一下spring的官方网站:http: ...
- 【转】oracle in和exists、not in和not exists原理和性能探究
转自http://www.2cto.com/database/201310/251176.html 对于in和exists.not in和not exists还是有很多的人有疑惑,更有甚者禁用not ...
- javax.el.PropertyNotFoundException:
javax.el.PropertyNotFoundException: Property 'ContextPath' not found on type org.apache.catalina.cor ...
- Android 点击ListView(或GridView)的一个item,使其里面textview变色,点击另一个这个恢复原来颜色
今天作一个项目,就是做视频app,如果电视剧的话有许多剧集,点击一个item,播放不同的剧集,要有点击效果,并且默认是选择第一个.花费了一段时间,自己觉得有点难 度,现在和大家分享一下,下面是效果显示 ...
- C堆栈入门
原文:http://student.csdn.net/link.php?url=http://www.top-e.org%2Fjiaoshi%2Fhtml%2F427.html 格式和部分内容稍作修改 ...
- VMware Player安装Debian系统
尝试用虚拟机来安装Debian系统,感觉这样一来安装与卸载方便,二来也可以在Linux系统安装出现问题的情况下方便在host主机上查找解决方法,同时也避免了要重新设置分区来安装Linux系统(双系统的 ...