2009年7月小记(WCF限流行为, 网站性能设置, 序列化的性能, 读取内嵌资源文件, WMI, declarative, XML声明, 相互转换)
1、WCF限流行为
限流“允许开发者限制客户端连接数以及服务的负荷。限流可以避免服务的最大化,以及分配与使用重要资源的最大化。引入限流技术后,一旦超出配置的设置值,WCF就会自动地将等待处理的调用者放入到队列中,然后依次从队列中取出。在队列中等待处理调用时,如果客户端的调用超时,客户端就会获得一个TimeoutException异常。每个服务类型都可以应用限流技术,也就是说,它会影响到服务的所有实例以及服务类型的所有终结点。实现方式是为限流与服务使用的每个通道分发器建立关联。”
MaxConcurrentCalls 消息并发处理的最大值(限制所有服务实例并发调用总数量),默认值:64
MaxConcurrentInstances 同一时刻服务上下文实例的最大数量(限制服务并发实例数量), 默认值:2147483647
MaxConcurrentSessions 同一时刻可以接受的最大会话数量(限制并发会话数量),默认值:10
在VS的post-build event中添加命令:sgen /a:”$(TargetPath)” /fore
4、读取内嵌资源文件
例如:有一个xml文件,设置为内嵌资源文件(Build Action: Embedded Resource),现在要用程序读取出来
protected void Page_Load(object sender, EventArgs e)
{
Response.Clear();
Response.ContentType = "text/xml";
Assembly assembly = new Source().GetType().Assembly;
using (Stream stream = assembly.GetManifestResourceStream("缺省的命名空间.groups.xml"))
{
using (StreamReader reader = new StreamReader(stream))
{
Response.Write(reader.ReadToEnd());
}
}
}
注意GetManifestResourceStream的参数格式为:<缺省的命名空间.><扩展命命名空间.><文件名>
其中<扩展命命名空间>,比如是文件所在的目录,如:缺省的命名空间.images.logo.jpg
另外,在ASP.NET 2.0中可以直接读取资源文件,并可享受内置的缓存功能
5、用PowerShell查看WMI信息
#安装WMI Administrative Tools
#PowerShell –> Get-WinObject –> class: WMI Tools中列出的Win32_SystemUsers
6、Lambda表达式的声明式(declarative)特性,函数式编程
static List<int> GetSquaresOfPositiveByLambda(List<string> strList)
{
return strList
.Select(s => Int32.Parse(s)) //转成整数
.Where(i => i % 2 == 0) //找出所有大于零的数
.Select(i => i * i) //算出每个数的平方
.OrderBy(i => i) //按照元素自身排序
.ToList(); //构造一个List
}
static Dictionary<char, List<string>> GetIndexByDelegate(IEnumerable<string> keywords)
{
return keywords
.GroupBy(k => k[0]) //按照首字母分组
.ToDictionary( //构造字典
g => g.Key, //以每组的Key作为键
g => g.OrderBy(k => k).ToList()); //对每组排序并生成列表
}
7、XDocument结合Lambda创建列表结点,以及XML声明。并且,让扩展ToString输出XML声明。
string[] strs = new string[] { "a", "b","c" };
XDocument doc = new XDocument(
new XDeclaration("1.0", "utf-8", null),
new XElement("Body",
new XElement("TimeStamp", DateTime.Now.ToString("yyyyMMddHHmmssfff")),
new XElement("CouponIds",
strs.Select<string, XElement>(s => new XElement("CouponId", s)).ToArray())
)
);
此方法输出了如下xml;
<?xml version="1.0" encoding="utf-8"?>
<Body>
<TimeStamp>20090813130648472</TimeStamp>
<CouponIds>
<CouponId>a</CouponId>
<CouponId>b</CouponId>
<CouponId>c</CouponId>
</CouponIds>
</Body>
#扩展方法,能输出XML声明为utf-8而不是utf-16的字符串,当然如果是保存在文件中的,可以直接用Save方法就行,XML声明可以原样保存
public static string ToXmlString(this XDocument doc)
{
return ToXmlString(doc, null);
}
public static string ToXmlString(this XDocument doc, XmlWriterSettings settings)
{
string xml = string.Empty;
using (MemoryStream stream = new MemoryStream())
{
using (XmlWriter xw = XmlWriter.Create(stream, settings))
{
doc.Save(xw);
}
xml = Encoding.UTF8.GetString(stream.ToArray());
}
return xml;
}
8、string、MemoryStream、byte[]的相互转换
#.字符串转比特数组
(1)byte[] bt=System.Text.Encoding.Default.GetBytes("字符串");
(2)byte[] bt=Convert.FromBase64String("字符串");
#.字符串转流
(1)MemoryStream ms=new MemoryStream(System.Text.Encoding.Default.GetBytes("字符串"));
(2)MemoryStream ms=new MemoryStream(Convert.FromBase64String("字符串"));
#.流转比特数组
(1)byte[] bt=ms.ToArray();
(2)MemoryStream ms=new MemoryStream();ms.Write(bt,0,ms.Length);
#.流转字符串
(1)string str=Convert.ToBase64String(ms.ToArray());
(2)string str=System.Text.Encoding.Default.GetString(ms.ToArray());
#.比特数组转字符串
(1)string str=System.Text.Encoding.Default.GetString(bt);
(2)string str=Convert.ToBase64String(bt);
#.比特数组转流
(1)MemoryStream ms=new MemoryStream(bt);
(2)MemoryStream ms=new MemoryStream();ms.Read(bt,0,bt.Lenght);