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 使用,支持压缩的更多相关文章

  1. 跨平台的zip文件压缩处理,支持压缩解压文件夹

    根据minizip改写的模块,需要zlib支持 输出的接口: #define RG_ZIP_FILE_REPLACE 0 #define RG_ZIP_FILE_APPEND 1 //压缩文件夹目录, ...

  2. 编译Hadoop 2.7.2支持压缩 转

    hadoop Native Shared Libraries 使得Hadoop可以使用多种压缩编码算法,来提高数据的io处理性能.不同的压缩库需要依赖到很多Linux本地共享库文件,社区提供的二进制安 ...

  3. hadoop对于压缩文件的支持及算法优缺点

    hadoop对于压缩文件的支持及算法优缺点   hadoop对于压缩格式的是透明识别,我们的MapReduce任务的执行是透明的,hadoop能够自动为我们 将压缩的文件解压,而不用我们去关心. 如果 ...

  4. gulp插件实现压缩一个文件夹下不同目录下的js文件(支持es6)

    gulp-uglify:压缩js大小,只支持es5 安装: cnpm: cnpm i gulp-uglify -D yarn: yarn add gulp-uglify -D 使用: 代码实现1:压缩 ...

  5. hadoop对于压缩文件的支持

    转载:https://www.cnblogs.com/ggjucheng/archive/2012/04/22/2465580.html hadoop对于压缩格式的是透明识别,我们的MapReduce ...

  6. Python如何支持读入gz压缩或未压缩文件?

    目录 需求 示例代码 笨办法 Pythonic方法 需求 要写一个接口,同时支持压缩和未压缩文件读入 示例代码 笨办法 import os import gzip filename = sys.arg ...

  7. java nio 写一个完整的http服务器 支持文件上传 chunk传输 gzip 压缩 使用过程 和servlet差不多

    java nio 写一个完整的http服务器  支持文件上传   chunk传输    gzip 压缩      也仿照着 netty处理了NIO的空轮询BUG        本项目并不复杂 代码不多 ...

  8. IIS7 启用GZip压缩

    GZip压缩通常会达到70%以上的压缩率,如果是手机Web这无疑会使网站的访问速度大大增加,无论是CSS合并.JS合并.图片合并都不如GZip压缩来得简单直接.如果一个网页是100K,那么启用GZip ...

  9. Nginx开启GZIP来压缩网页

    HTTP协议上的GZIP编码是一种用来改进web应 用程序性能的技术.大流量的WEB站点常常使用GZIP压缩技术来让用户感受更快的速度.这一般是指WWW服务器中安装的一个功能,当有人来访问这个服务器中 ...

随机推荐

  1. 用户 NT AUTHORITY\NETWORK SERVICE 登录失败 解决方法(转载)

    用户 NT AUTHORITY\NETWORK SERVICE 登录失败 解决方法 (MS SQL 2005) Windows server 2003,2008 Web.Config 配置连接sql ...

  2. mmzb游戏事故分析

    最近一次线上更新,老项目挂了,遍地哀嚎,日活跃掉了好多,心痛... 这次维护时,SA为了缩减硬件资源,做了一次数据库迁移.给到开发手上的player db,只有一些索引数据,不带有任一玩家数据.玩家上 ...

  3. 移动端头像上传AJax input file

    jQuery中的Ajax不能支持 input file 需要用ajaxupload.js但是先需要引入jQuery文件 <script src="__PUBLIC__/js/ajaxf ...

  4. 关于MySQL5.6.25在Win7 64bit下重装后无法启动的解决方法

    在重装MySQL5.6.25安装到进行配置的时候,一直在等待服务的启动.如果手动在系统服务启动会提示1067错误,这个错误在网上很常见,然而我试过了很多方法均无法解决. 于是看ProgramData\ ...

  5. 手动创建Spring项目 Spring framework

    之前学习框架一直是看的视频教程,并且在都配套有项目源码,跟着视频敲代码总是很简单,现在想深入了解,自己从官网下载文件手动搭建,就遇到了很多问题记载如下. 首先熟悉一下spring的官方网站:http: ...

  6. 【转】oracle in和exists、not in和not exists原理和性能探究

    转自http://www.2cto.com/database/201310/251176.html 对于in和exists.not in和not exists还是有很多的人有疑惑,更有甚者禁用not ...

  7. javax.el.PropertyNotFoundException:

    javax.el.PropertyNotFoundException: Property 'ContextPath' not found on type org.apache.catalina.cor ...

  8. Android 点击ListView(或GridView)的一个item,使其里面textview变色,点击另一个这个恢复原来颜色

    今天作一个项目,就是做视频app,如果电视剧的话有许多剧集,点击一个item,播放不同的剧集,要有点击效果,并且默认是选择第一个.花费了一段时间,自己觉得有点难 度,现在和大家分享一下,下面是效果显示 ...

  9. C堆栈入门

    原文:http://student.csdn.net/link.php?url=http://www.top-e.org%2Fjiaoshi%2Fhtml%2F427.html 格式和部分内容稍作修改 ...

  10. VMware Player安装Debian系统

    尝试用虚拟机来安装Debian系统,感觉这样一来安装与卸载方便,二来也可以在Linux系统安装出现问题的情况下方便在host主机上查找解决方法,同时也避免了要重新设置分区来安装Linux系统(双系统的 ...