在2007版中,我们通过webservice获取所有的文件夹,根据文件夹的信息来累计文件夹已使用大小。 但是消耗资源也较大,每次在第一次访问的时候大概在3s左右。那么有没有更好更快的办法呢 ?
当然是有的,首先考虑的问题,那么owa自己是怎么做呢,他自己有没有获取这些数据呢?
既然它可以取到?那么我们自然也可以通过它的方式取到罗?
测试开始。。。
用fiddler2 监控一下 ,发现了以下可疑的链接?
进一步查看:
看上图的文字?对了这就是我们要的数据了,就是这个请求了。。
前面一个数字是byte数,后面是显示的文字,转换成了kb,当大于1mb时就转换成mb
那接下来的事就比较简单了。就是如何来构建这个请求了。我们来仔细看下这个请求。见下图
上图可知,请求只post方式:
url地址为:http://mail.lab.com/owa/ev.owa?oeh=1&ns=Tree&ev=GetMailboxUsage ;
其中http://mail.lab.com/owa 为owa的根路径
需要下列的文件头:
Accept: */*
Accept-Language: zh-cn
Referer: http://mail.lab.com/owa/
UA-CPU: x86
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; SLCC1; .NET CLR 2.0.50727; .NET CLR 3.0.04506; .NET CLR 3.5.21022)
Host: mail.lab.com
Content-Length: 9
Connection: Keep-Alive
Pragma: no-cache
Cookie: UserContext=5148366543cf495697cfa3dcb434d772
Authorization: Basic bGFiXHN5czpBcHAxMjM0
删除没必要的文件头(一个一个删除来测试是否必要)
User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; SLCC1; .NET CLR 2.0.50727; .NET CLR 3.0.04506; .NET CLR 3.5.21022)
Host: mail.lab.com
Content-Length: 9
Authorization: Basic bGFiXHN5czpBcHAxMjM0
其中:Authorization为变量,即当前用户的登录信息;
请求的body体
<params/>
通过httpResponse,和httpRequest来构建这个请求吧
以下是详细代码:
using System.Collections.Generic;
using System.Text;
using System.Net;
using System.Text.RegularExpressions;
using System.IO;
namespace Beyondbit.Components.Exchange
{
public class UseAgeHelp
{
public UseAgeHelp(string account, string password, string domain)
{
_account = account;
_password = password;
_domain = domain;
}
private string _account = "";
private string _password = "";
private string _domain = "";
private string GetMailboxUsageString()
{
string url = Config.ExchangeServerPath + "ev.owa?oeh=1&ns=Tree&ev=GetMailboxUsage";
WebResponse ret = HttpCallGetMailboxUsage(url);
Stream stream = ret.GetResponseStream();
StreamReader sr = new StreamReader(stream, Encoding.GetEncoding("UTF-8"));
string htmlstr = sr.ReadToEnd();
return htmlstr;
}
/// <summary>
/// 获取用户已经使用的容量
/// </summary>
/// <returns>返回已使用容量的byte数 /1024 单位为kb 再/1024 单位为 MB</returns>
public int GetMailboxUsage()
{
string usageString = GetMailboxUsageString();
Match mc = Regex.Match(usageString, @"^<div id=mbUsg>([\d]+)</div><div id=dspMbUsg>([\d|\w|\W]+)</div>$");
return Convert.ToInt32(mc.Groups[1].Value);
}
/// <summary>
/// 获取用户已经使用的容量
/// </summary>
/// <returns>返回已使用容量的原始文本</returns>
public string GetMailboxUsageSourceString()
{
string usageString = GetMailboxUsageString();
Match mc = Regex.Match(usageString, @"^<div id=mbUsg>([\d]+)</div><div id=dspMbUsg>([\d|\w|\W]+)</div>$");
return mc.Groups[0].Value;
}
/// <summary>
/// 获取用户已经使用的容量
/// </summary>
/// <returns>返回已使用容量的显示文本</returns>
public string GetMailboxUsageDisplayString()
{
string usageString = GetMailboxUsageString();
Match mc = Regex.Match(usageString, @"^<div id=mbUsg>([\d]+)</div><div id=dspMbUsg>([\d|\w|\W]+)</div>$");
return mc.Groups[2].Value;
}
private WebResponse HttpCallGetMailboxUsage(string url)
{
HttpWebRequest Req;
try
{
//构建当前用户的凭据 ,以下两行
System.Net.CredentialCache MyCredentialCache = new System.Net.CredentialCache();
MyCredentialCache.Add(new Uri(url), "basic", new System.Net.NetworkCredential(_account, _password, _domain));
//生成一个请求类
Req = (System.Net.HttpWebRequest)HttpWebRequest.Create(url);
//把当前凭据设置成已经建立好的凭据
Req.Credentials = MyCredentialCache;
//设置请求的方式为POST
Req.Method = "POST";
//该项可有可无
Req.ContentType = "application/x-www-form-urlencoded";
Req.AllowAutoRedirect = true;
//用户客户端类型,我们把它设置成IE
Req.UserAgent = "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; SLCC1; .NET CLR 2.0.50727; .NET CLR 3.0.04506; .NET CLR 3.5.21022)";
//构建请求的消息体body
byte[] paraStream = Encoding.UTF8.GetBytes("<params/>");//写死body的内容
Req.ContentLength = paraStream.Length;
Stream newStream = Req.GetRequestStream();
newStream.Write(paraStream, 0, paraStream.Length);
newStream.Close();
//Stream request =Req.GetRequestStream();
//request.Write(
}
catch (Exception ex)
{
throw ex;
}
try
{
//发起请求,并返回Response的对象
WebResponse result = Req.GetResponse();
return result;
}
catch (Exception ex)
{
throw ex;
}
}
}
}