中转站

场景:用于绑定ip在某服务器上,但需要本地调试,此时需再服务器做个中转

一般处理程序ashx:

/// <summary>
    /// 中转 绑定ip中转请求;参数Base64解密,gzip压缩返回;
    /// kk
    /// </summary>
    public class tc : IHttpHandler
    {
        public void ProcessRequest(HttpContext context)
        {
            Dictionary<string, string> dict = AnaylerUrlParaGet(context.Request);
            if (dict.Count == 0 || string.IsNullOrEmpty(dict["url"]) || string.IsNullOrEmpty(dict["postdata"]))
            {
                context.Response.ContentType = "text/plain";
                context.Response.Write("no post data");
                context.Response.End();
            }
            HttpUtil _httputil = new HttpUtil();
            string strurl = Base64.DecodeBase64IgnoreEmpty(dict["url"]);
            string strJson = Base64.DecodeBase64IgnoreEmpty(dict["postdata"]);
            string strcontext = _httputil.HttpPost(strurl, strJson, System.Text.Encoding.UTF8);
            context.Response.ContentType = "application/octet-stream";
            context.Response.BinaryWrite(Common.EncryptHelper.Compress(strcontext));
            context.Response.Flush();
            context.Response.End();
        }

        public bool IsReusable
        {
            get
            {
                return false;
            }
        }

        /// <summary>
        /// 获取GET参数
        /// </summary>
        /// <param name="req"></param>
        /// <returns></returns>
        public Dictionary<string, string> AnaylerUrlParaGet(System.Web.HttpRequest req)
        {
            Dictionary<string, string> dict = new Dictionary<string, string>();
            string tmp1;
            string tmp2;
            System.Collections.Specialized.NameValueCollection col = req.QueryString;
            for (int i = 0; i < col.Count; i++)
            {
                tmp1 = col.AllKeys[i].Trim();
                tmp2 = col[i].Trim();
                if (!dict.ContainsKey(tmp1))
                {
                    dict.Add(tmp1, tmp2);
                }
            }
            return dict;
        }
    }

调用:

 private string PolicyMethod(object req, string strurl)
        {
            string result = string.Empty;
            try
            {
                string BindUrl = "http://http://localhost:3600/tc.ashx"; //服务器对应ip地址
                string strdata = GZipUtils.Compress(SerializeUtil.SerializeXml(req), Encoding.Unicode);
                string url = BindUrl + "?url=" + Base64.EncodeBase64IgnoreEmpty(strurl) + "&postdata=" + Base64.EncodeBase64IgnoreEmpty(strdata);

                result = _httputil.HttpGet(url, System.Text.Encoding.UTF8, "gzip", 20);
            }
            catch (Exception ex)
            {
                LogUtils.Debug("PolicyMethod出错:" + ex.Message);
            }
            return result;
        }

HttpUtil帮助类:

public class HttpUtil
    {
        public string HttpPost(string url, string data, Encoding encoding)
        {
            return HttpPost(url, data, "text/plain", encoding);
        }

        public string HttpGet(string url, Encoding encoding)
        {
            return HttpSend(url, "", "text/plain", Encoding.GetEncoding("utf-8"), "GET");
        }

        public string HttpGet(string url, Encoding encoding, int timeout)
        {
            return HttpSend(url, "", "text/plain", Encoding.GetEncoding("utf-8"), "GET", null, "", timeout);
        }
        public string HttpGet(string url, string data, string contenttype, Encoding encoding, Dictionary<string, string> Headers = null, string Strcompress = "", int timeout = 0)
        {
            return HttpSend(url, data, contenttype, encoding, "GET", Headers, Strcompress, timeout);
        }

        public string HttpGet(string url, Encoding encoding, string Strcompress, int timeout = 0)
        {
            return HttpSend(url, "", "text/plain", Encoding.GetEncoding("utf-8"), "GET", null, Strcompress, timeout);
        }

        public string HttpGet2(string url, Encoding encoding, string Strcompress, int timeout = 0)
        {
            return HttpSend2(url, "", "text/plain", Encoding.GetEncoding("utf-8"), "GET", null, Strcompress, timeout);
        }

        public string HttpGet(string url, string contenttype, Encoding encoding)
        {
            return HttpSend(url, "", contenttype, Encoding.GetEncoding("utf-8"), "GET");
        }

        public string HttpPost(string url, string data, string contenttype, Encoding encoding, Dictionary<string, string> Headers = null, string Strcompress = "", int timeout = 0)
        {
            return HttpSend(url, data, contenttype, encoding, "POST", Headers, Strcompress, timeout);
        }
        public string HttpPut(string url, string data, string contenttype, Encoding encoding, Dictionary<string, string> Headers = null)
        {
            return HttpSend(url, data, contenttype, encoding, "PUT", Headers);
        }

        private string HttpSend(string url, string data, string contenttype, Encoding encoding, string method, Dictionary<string, string> Headers = null, string Strcompress = ""
            , int timeout = 0)
        {
            try
            {
                HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(url);
                if (Strcompress == "gzip")
                {
                    request.Headers.Add("Accept-Encoding", "gzip");
                }
                if (timeout > 0)
                {
                    request.Timeout = timeout * 1000;
                }
                request.Method = method;
                if (!string.IsNullOrEmpty(contenttype))
                    request.ContentType = contenttype;
                //设置Header信息
                if (Headers != null && Headers.Count > 0)
                {
                    foreach (KeyValuePair<string, string> item in Headers)
                        if (!string.IsNullOrEmpty(item.Key) && !string.IsNullOrEmpty(item.Value))
                            request.Headers.Add(item.Key, item.Value);
                }
                if (data != "")
                {
                    byte[] bs = encoding.GetBytes(data);
                    request.ContentLength = bs.Length;
                    request.Timeout = 120 * 1000;
                    using (Stream reqStream = request.GetRequestStream())
                    {
                        reqStream.Write(bs, 0, bs.Length);
                    }
                }
                HttpWebResponse response = (HttpWebResponse)request.GetResponse();

                Stream stream = response.GetResponseStream();

                if (Strcompress == "gzip")
                    stream = new GZipStream(stream, CompressionMode.Decompress);
                //if (response.ContentEncoding.ToLower().Contains("gzip"))
                //    stream = new GZipStream(stream, CompressionMode.Decompress);
                //else if (response.ContentEncoding.ToLower().Contains("deflate"))
                //    stream = new DeflateStream(stream, CompressionMode.Decompress);

                MemoryStream memoryStream = new MemoryStream();
                int bufferLength = 1024;
                byte[] b = new byte[bufferLength];

                int actual;

                while ((actual = stream.Read(b, 0, bufferLength)) > 0)
                {
                    memoryStream.Write(b, 0, actual);
                }
                memoryStream.Position = 0;

                byte[] bt = memoryStream.ToArray();

                //无视编码
                //if (encoding == null)
                //{
                string temp = Encoding.Default.GetString(bt, 0, bt.Length);
                //<meta(.*?)charset([\s]?)=[^>](.*?)>
                Match meta = Regex.Match(temp, "<meta([^<]*)charset=([^<]*)[\"‘]", RegexOptions.IgnoreCase | RegexOptions.Multiline);
                string charter = (meta.Groups.Count > 2) ? meta.Groups[2].Value : string.Empty;
                charter = charter.Replace("\"", string.Empty).Replace("‘", string.Empty).Replace(";", string.Empty);
                if (charter.Length > 0)
                {
                    charter = charter.ToLower().Replace("iso-8859-1", "gbk");
                    encoding = Encoding.GetEncoding(charter);
                }
                else
                {
                    if (response.CharacterSet != null)
                    {
                        if (response.CharacterSet.ToLower().Trim() == "iso-8859-1")
                        {
                            encoding = Encoding.GetEncoding("gbk");
                        }
                        else
                        {
                            if (string.IsNullOrEmpty(response.CharacterSet.Trim()))
                            {
                                encoding = Encoding.UTF8;
                            }
                            else
                            {
                                encoding = Encoding.GetEncoding(response.CharacterSet);
                            }
                        }
                    }
                }
                //}

                stream.Close();
                stream.Dispose();
                response.Close();

                return encoding.GetString(bt);
            }
            catch (Exception e)
            {
                LogUtils.Debug(e.Message);
                return "";
            }
        }

        private string HttpSend2(string url, string data, string contenttype, Encoding encoding, string method, Dictionary<string, string> Headers = null, string Strcompress = ""
            , int timeout = 0)
        {
            try
            {
                HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(url);
                if (Strcompress == "gzip")
                {
                    request.Headers.Add("Accept-Encoding", "gzip");
                }
                if (timeout > 0)
                {
                    request.Timeout = timeout * 1000;
                }
                request.Method = method;
                if (!string.IsNullOrEmpty(contenttype))
                    request.ContentType = contenttype;
                //设置Header信息
                if (Headers != null && Headers.Count > 0)
                {
                    foreach (KeyValuePair<string, string> item in Headers)
                        if (!string.IsNullOrEmpty(item.Key) && !string.IsNullOrEmpty(item.Value))
                            request.Headers.Add(item.Key, item.Value);
                }
                if (data != "")
                {
                    byte[] bs = encoding.GetBytes(data);
                    request.ContentLength = bs.Length;
                    request.Timeout = 120 * 1000;
                    using (Stream reqStream = request.GetRequestStream())
                    {
                        reqStream.Write(bs, 0, bs.Length);
                    }
                }
                HttpWebResponse response = (HttpWebResponse)request.GetResponse();

                Stream stream = response.GetResponseStream();

                if (Strcompress == "gzip")
                    stream = new GZipStream(stream, CompressionMode.Decompress);
                //if (response.ContentEncoding.ToLower().Contains("gzip"))
                //    stream = new GZipStream(stream, CompressionMode.Decompress);
                //else if (response.ContentEncoding.ToLower().Contains("deflate"))
                //    stream = new DeflateStream(stream, CompressionMode.Decompress);

                //stream = new GZipStream(stream, CompressionMode.Decompress);

                MemoryStream memoryStream = new MemoryStream();
                int bufferLength = 1024;
                byte[] b = new byte[bufferLength];

                int actual;

                while ((actual = stream.Read(b, 0, bufferLength)) > 0)
                {
                    memoryStream.Write(b, 0, actual);
                }
                memoryStream.Position = 0;

                byte[] bt = memoryStream.ToArray();

                //无视编码
                //if (encoding == null)
                //{
                string temp = Encoding.Default.GetString(bt, 0, bt.Length);
                //<meta(.*?)charset([\s]?)=[^>](.*?)>
                Match meta = Regex.Match(temp, "<meta([^<]*)charset=([^<]*)[\"‘]", RegexOptions.IgnoreCase | RegexOptions.Multiline);
                string charter = (meta.Groups.Count > 2) ? meta.Groups[2].Value : string.Empty;
                charter = charter.Replace("\"", string.Empty).Replace("‘", string.Empty).Replace(";", string.Empty);
                if (charter.Length > 0)
                {
                    charter = charter.ToLower().Replace("iso-8859-1", "gbk");
                    encoding = Encoding.GetEncoding(charter);
                }
                else
                {
                    if (response.CharacterSet.ToLower().Trim() == "iso-8859-1")
                    {
                        encoding = Encoding.GetEncoding("gbk");
                    }
                    else
                    {
                        if (string.IsNullOrEmpty(response.CharacterSet.Trim()))
                        {
                            encoding = Encoding.UTF8;
                        }
                        else
                        {
                            encoding = Encoding.GetEncoding(response.CharacterSet);
                        }
                    }
                }
                //}

                stream.Close();
                stream.Dispose();
                response.Close();

                return encoding.GetString(bt);
            }
            catch (Exception e)
            {
                return e.Message;
                LogUtils.Debug(e.Message);
                return "";
            }
        }

        /// <summary>
        /// 以指定编码通过POST方式发送数据。
        /// </summary>
        /// <param name="Url">url</param>
        /// <param name="postString">Post数据</param>
        /// <returns></returns>
        public string PostString(string Url, string postString, Encoding ed)
        {
            var data = ed.GetBytes(postString);

            var request = (HttpWebRequest)WebRequest.Create(Url);
            request.Method = "POST";
            request.ContentType = "application/x-www-form-urlencoded";
            request.ContentLength = data.Length;
            using (var wStream = request.GetRequestStream())
            {
                wStream.Write(data, 0, data.Length);
            }

            var response = (HttpWebResponse)request.GetResponse();
            var rt = string.Empty;
            using (var rStream = new StreamReader(response.GetResponseStream(), ed))
            {
                rt = rStream.ReadToEnd();
            }
            response.Close();

            return rt;
        }

        /// <summary>
        /// 以utf-8编码通过POST方式发送数据。
        /// </summary>
        /// <param name="Url">url</param>
        /// <param name="postString">Post数据</param>
        /// <returns></returns>
        public string PostString_UTF8(string Url, string postString)
        {
            return PostString(Url, postString, Encoding.UTF8);
        }

    }

Base64帮助类:

public class Base64
    {
        /// <summary>
        /// Base64加密
        /// </summary>
        /// <param name="codeName">加密采用的编码方式</param>
        /// <param name="source">待加密的明文</param>
        /// <returns></returns>
        public static string EncodeBase64(Encoding encode, string source)
        {
            string result = string.Empty;
            byte[] bytes = encode.GetBytes(source);
            try
            {
                result = Convert.ToBase64String(bytes);
            }
            catch
            {
                result = source;
            }
            return result;
        }

        /// <summary>
        /// Base64加密,采用utf8编码方式加密
        /// </summary>
        /// <param name="source">待加密的明文</param>
        /// <returns>加密后的字符串</returns>
        public static string EncodeBase64(string source)
        {
            return EncodeBase64(Encoding.UTF8, source);
        }

        /// <summary>
        /// Base64解密
        /// </summary>
        /// <param name="codeName">解密采用的编码方式,注意和加密时采用的方式一致</param>
        /// <param name="result">待解密的密文</param>
        /// <returns>解密后的字符串</returns>
        public static string DecodeBase64(Encoding encode, string result)
        {
            string decode = "";
            byte[] bytes = Convert.FromBase64String(result);
            try
            {
                decode = encode.GetString(bytes);
            }
            catch
            {
                decode = result;
            }
            return decode;
        }

        /// <summary>
        /// Base64解密,采用utf8编码方式解密
        /// </summary>
        /// <param name="result">待解密的密文</param>
        /// <returns>解密后的字符串</returns>
        public static string DecodeBase64(string result)
        {
            return DecodeBase64(Encoding.UTF8, result);
        }

        /// <summary>
        /// Base64解密,采用utf8编码方式解密
        /// </summary>
        /// <param name="result">待解密的密文</param>
        /// <returns>解密后的字符串</returns>
        public static string DecodeBase64IgnoreEmpty(string result)
        {
            return DecodeBase64(Encoding.UTF8, result.Replace("+", "%2B"));
        }

        /// <summary>
        /// Base64加密,采用utf8编码方式加密
        /// </summary>
        /// <param name="source">待加密的明文</param>
        /// <returns>加密后的字符串</returns>
        public static string EncodeBase64IgnoreEmpty(string source)
        {
            return EncodeBase64(Encoding.UTF8, source.Replace("%2B", "+"));
        }
    }

EncryptHelper帮助类:

 public class EncryptHelper
    {
        /// <summary>
        /// MD5
        /// </summary>
        /// <param name="str"></param>
        /// <param name="code"></param>
        /// <returns></returns>
        public static string MD5(string str, int code)
        {
            if (code == 16) //16位MD5加密(取32位加密的9~25字符)
            {
                return System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(str, "MD5").ToLower().Substring(8, 16);
            }
            if (code == 32) //32位加密
            {
                return System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(str, "MD5").ToLower();
            }
            return "00000000000000000000000000000000";

        }

        /// <summary>
        /// AES加密函数(128位) 加密模式:AES/CBC/PKCS5Padding  加密初始化向量:长度为  16 的空字节数组
        /// </summary>
        /// <param name="toEncrypt"></param>
        /// <returns></returns>
        public static string Encrypt(string toEncrypt,string key)
        {
            byte[] keyArray = UTF8Encoding.UTF8.GetBytes(key);
            byte[] toEncryptArray = UTF8Encoding.UTF8.GetBytes(toEncrypt);

            RijndaelManaged rDel = new RijndaelManaged();
            rDel.IV = new byte[16];
            rDel.Key = keyArray;
            rDel.Mode = CipherMode.CBC;
            rDel.Padding = PaddingMode.PKCS7;

            ICryptoTransform cTransform = rDel.CreateEncryptor();
            byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length);

            return Convert.ToBase64String(resultArray, 0, resultArray.Length);
        }

        /// <summary>
        /// AES解密函数(128位)
        /// </summary>
        /// <param name="toDecrypt"></param>
        /// <returns></returns>
        public static string Decrypt(string toDecrypt, string key)
        {
            byte[] keyArray = UTF8Encoding.UTF8.GetBytes(key);
            byte[] toEncryptArray = Convert.FromBase64String(toDecrypt);

            RijndaelManaged rDel = new RijndaelManaged();
            rDel.IV = new byte[16];
            rDel.Key = keyArray;
            rDel.Mode = CipherMode.CBC;
            rDel.Padding = PaddingMode.PKCS7;

            ICryptoTransform cTransform = rDel.CreateDecryptor();
            byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length);

            return UTF8Encoding.UTF8.GetString(resultArray);
        }

        public static string Encrypt2(string toEncrypt)
        {
            StringBuilder sb = new StringBuilder();
            int asc = 0;
            foreach (char c in toEncrypt)
            {
                asc = (int)c;
                sb.Append(Convert.ToString(asc, 8) + "9");
            }

            return sb.ToString();
        }

        public static string Decrypt2(string toEncrypt)
        {
            string[] ss = toEncrypt.Split(new char[] { ‘9‘ }, StringSplitOptions.RemoveEmptyEntries);
            StringBuilder sb = new StringBuilder();
            foreach (string s in ss)
            {
                sb.Append(Convert.ToChar(Convert.ToInt32(s, 8)).ToString());
            }

            return sb.ToString();
        }

        /// <summary>
        /// GZip解压
        /// </summary>
        /// <param name="inputStr"></param>
        /// <returns></returns>
        public static string Decompress(string inputStr)
        {
            byte[] bs = Convert.FromBase64String(inputStr);
            MemoryStream ms = new MemoryStream(bs);
            GZipStream zipStream = new GZipStream(ms, CompressionMode.Decompress);

            string result = "";
            using (StreamReader sr = new StreamReader(zipStream))
            {
                result = sr.ReadToEnd();
            }

            zipStream.Close();
            ms.Dispose();
            ms.Close();

            return result;
        }

        /// <summary>
        /// GZip压缩
        /// </summary>
        /// <param name="inputStr"></param>
        /// <returns></returns>
        public static byte[] Compress(string inputStr)
        {
            //if (string.IsNullOrEmpty(inputStr))
            //{
            //    return "";
            //}

            byte[] bs = Encoding.UTF8.GetBytes(inputStr);

            MemoryStream ms = new MemoryStream();
            using (GZipStream zipStream = new GZipStream(ms, CompressionMode.Compress, true))
            {
                zipStream.Write(bs, 0, bs.Length);
            }

            return ms.ToArray();

            //byte[] res = ms.ToArray();

            //ms.Dispose();
            //ms.Close();
            //return Convert.ToBase64String(res);
        }

    }

时间: 2024-10-13 21:16:08

中转站的相关文章

前端好玩技术中转站

--------有新鲜发现就会更新此帖----------- 前言 本文不是技术原创.但立志成为前端各种新鲜.hack技术的链接中转站 O(∩_∩)O.文章有不足或者过时技术的话也恳请各位指出.笔者能力有限,但尽量每接触一个新鲜好玩有效的技术会更新到此贴.热烈欢迎各位大大在评论区留下大家的对前端技术分享和评论 ,笔者会添加相应的链接并增加到此文(*^__^*) 一.flexble —— 手淘移动终端适配解决方案 推酷介绍:http://www.tuicool.com/articles/nmm6r

文件中转站与超大附件

1.什么是文件中转站,有什么作用? 文件中转站提供大文件网络临时存储的服务,文件中转站可帮助您在多台电脑间灵活中转文件,如在您的家用电脑和工作用电脑间中转文件:同时还可以发送超大附件,解决传统邮件附件大小受限的问题. 2.什么是超大附件,与普通附件有什么不同? 我们知道普通“邮件附件”一般都是20M.30M(具体由管理员设置),还要担心对方邮箱能不能接收这么大的附件.现在,如果您的邮箱开通了文件中转站(位于网络硬盘中),您邮件的大附件可达到2G(具体由管理员设置),并且可发送到任何邮箱地址.收件

国外网盘下载 中转站使用方法

百度网盘限速,很坑,但国外的网盘很多都更坑. 貌似国外网盘只有mega算良心,其他的都是变着法的耍人.限速20K,不能断点续传,只能一次下一个文件,重下需要过20分.各种奇葩应有尽有. 想解除限制就交钱,一般最便宜的也要10美元每月.所以外国人在这种折磨下,创造出了一种新的工具:中转站. 中转站就是站长买了会员,建个网站自动给别人下,别人提交链接就行. 但站长又不是天使,总不可能好心的自己掏钱给别人下载.所以中转站一般也有限制,比如规定你下载的文件不能超过2G,或者每天只能下载两个. 想突破中转

QQ文件中转站&ldquo;群共享文件&rdquo;初体验

月夜 刚刚收到了QQ邮箱管理员([email protected])发来的一封题为"欢迎体验群文件共享功能"的邮件. 开始以为是QQ群的共享文件功能,没有太在意:但打开邮件仔细看了一下才发现,原来这是QQ文件中转站的一个新功能. 什么是群共享文件? 群共享文件,是可以把您的文件中转站中的文件,共享给QQ群的功能.有了这项功能,你就不必通过发送群邮件的方式来与群友分享文件了,最大限度的方便了你使用QQ文件中转站. 怎么使用群共享文件功能? 进入QQ邮箱中的文件中转站,我们可以看到如下图所

知识中转站 (漏洞待完善,然后删除)

1.jQuery.fx.off: 关闭页面上的所有动画.   jQuery.fx.off = true 2.jQuery.fx.interval  设置动画的显示帧速. jQuery.fx.interval = 100;      毫秒 3.finish()   停止当前正在运行的动画,删除所有排队的动画       $(“div”).finish(); 4.$.pproxy(函数,对象 )  参数不分先后顺序都可以,    为函数指定作用域 5.isotope插件    图片社交网站效果 6.

大型分布式C++框架《四:netio之请求包中转站 上》

本来一篇文章就该搞定的.结果要分上下篇了.主要是最近颈椎很不舒服.同时还在做秒杀的需求也挺忙的. 现在不能久坐.看代码的时间变少了.然后还买了两本治疗颈椎的书.在学着,不过感觉没啥用.突然心里好害怕.如果颈椎病越来越重.以后的路怎么走. 现在上下班有跑步,然后坐一个小时就起来活动活动.然后在跟着同时们一起去打羽毛球吧.也快30的人了.现在发觉身体才是真的.其他都没什么意思.兄弟们也得注意~~ 废话不多说.下面介绍下netio. netio在系统中主要是一个分包的作用.netio本事没有任何的业务

k站中转站最便宜路线问题

function fn(src, dst, k) { //对n个城市m个航班做飞行说明 let fights = [ [0,1,100], [1,2,100], [0,2,500] ]; //计算最便宜的路线 let cheap = (src, dst, k) => { // 找到dst的前一站 let prev = fights.filter(i=>i[1]==dst); let min = Math.min.apply(null, prev.map(i =>{ //从des向前找,找

Azure Messaging-ServiceBus Messaging消息队列技术系列6-消息回执

上篇博文中我们介绍了Azure Messaging的重复消息机制.At most once 和At least once. Azure Messaging-ServiceBus Messaging消息队列技术系列5-重复消息:at-least-once at-most-once 本文中我们主要研究并介绍Azure Messaging的消息回执机制:实际应用场景: 同步收发场景下,消息生产者和消费者双向应答模式,例如:张三写封信送到邮局中转站,然后李四从中转站获得信,然后在写一份回执信,放到中转站

做“双创”服务的创业者,是不是该考虑下垂直极限呢

文/张书乐 原载于<人民邮电报>2016年12月9日<乐游记>专栏125期 2015年热火朝天的创业咖啡馆,到了今年冬天明显变冷清了.笔者前不久在长沙岳麓山下散步,路过去年频繁出现在新闻里的一家创业咖啡馆,除了门庭冷落车马稀外,原本入驻颇多的创业团队如今也完成了"从1到0"的变化,更不要说展示创业者成就的2楼,干脆直接改行做了书吧.也好,"书吧+咖啡",对于以咖啡馆作为大本营的创业者来说,更实在.毕竟,做"创业+咖啡"不容