现在的位置: 首页 > 综合 > 正文

2009年7月小记(WCF限流行为, 网站性能设置, 序列化的性能, 读取内嵌资源文件, WMI, declarative, XML声明, 相互转换)

2012年10月30日 ⁄ 综合 ⁄ 共 3694字 ⁄ 字号 评论关闭

www.facebuyer.com 买家面对面

1、WCF限流行为

限流“允许开发者限制客户端连接数以及服务的负荷。限流可以避免服务的最大化,以及分配与使用重要资源的最大化。引入限流技术后,一旦超出配置的设置值,WCF就会自动地将等待处理的调用者放入到队列中,然后依次从队列中取出。在队列中等待处理调用时,如果客户端的调用超时,客户端就会获得一个TimeoutException异常。每个服务类型都可以应用限流技术,也就是说,它会影响到服务的所有实例以及服务类型的所有终结点。实现方式是为限流与服务使用的每个通道分发器建立关联。”

MaxConcurrentCalls           消息并发处理的最大值(限制所有服务实例并发调用总数量),默认值:64

MaxConcurrentInstances    同一时刻服务上下文实例的最大数量(限制服务并发实例数量), 默认值:2147483647

MaxConcurrentSessions     同一时刻可以接受的最大会话数量(限制并发会话数量),默认值:10

2、web.config优化网站性能设置

3、使用sgen提高序列化的性能

在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);

抱歉!评论已关闭.