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. iOS 源代码管理工具之SVN

    源代码管理工具之SVN 源代码管理工具SVN是一款非常强大的源代码管理工具,现在国内70%-90%的公司都在使用SVN来管理源代码,下面就让小编给大家着重介绍一下SVN的使用,SVN的使用主要分为下面 ...

  2. C语言拾遗

    1. 没C++那么恶心的const C语言中的const修饰符用于修饰一个变量是const属性的.被C语言的const修饰的变量具有只读属性,并且不能被修改. const修饰的变量 != 常量,con ...

  3. ubuntu14 opencv python 安装

    本文记录了Ubuntu 14.04下使用源码手动安装OpenCV 3.0的过程.此外记录了在Python中安装及载入OpenCV的方法. 1.安装OpenCV所需的库(编译器.必须库.可选库) GCC ...

  4. python 自学 1 day

    #!/usr/bin/env python #coding = utf-8 age_of_oldby = 56 user = "fyt" word = "fyt" ...

  5. CLR via C# 3rd - 07 - Constants and Fields

    1. Constants        A constant is a symbol that has a never-changing value. When defining a constant ...

  6. frame与frame之间怎么用jquery传值

    frame与frame之间如何用jquery传值 使用jquery操作iframe 1. 内容里有两个ifame <iframe id="leftiframe"...< ...

  7. 413 Request Entity Too Large

    做小视频上传,结果接口总是返回500,服务器端跟踪,根本就进不来,再次翻查,发下服务器返回的其实是413,只不过APP底层接口将所有不是200的回包都转成500了,问题定位. 有了错误码,有了描述,字 ...

  8. 同时有background-size background-positon 两个属性的时候,如何在合并的background样式中展示

    今日写css,遇到background很多属性,于是想合并写,w3c只是说了各个属性都可以合并,但是并没有给出background-size background-positon合并的具体例子 bac ...

  9. JSWindow对象

    Window 对象 Window 对象表示浏览器中打开的窗口. 如果文档包含框架(frame 或 iframe 标签),浏览器会为 HTML 文档创建一个 window 对象,并为每个框架创建一个额外 ...

  10. 数组map()方法和filter()方法及字符串startsWith(anotherString)和endsWith(anotherString)方法

    map方法的作用不难理解,"映射"嘛,也就是原数组被"映射"成对应新数组 var newArr = arr.map(function() {});例子: var ...