<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom"><title type="text">博客园_yahle的blog</title><subtitle type="text">关注.net技术，关注企业信息化更加关注游戏开发</subtitle><id>http://feed.cnblogs.com/blog/u/25376/rss</id><updated>2011-10-15T02:20:40Z</updated><author><name>yahle</name><uri>http://www.cnblogs.com/yahle/</uri></author><generator>CNBlogs BlogServer</generator><link rel="alternate" type="text/html" href="http://www.cnblogs.com/yahle/"/><link rel="self" type="application/atom+xml" href="http://feed.cnblogs.com/blog/u/25376/rss"/><entry><id>http://www.cnblogs.com/yahle/archive/2011/02/12/1952209.html</id><title type="text">让statlight支持文件下载</title><summary type="text">起因：在写silverlight的功能时，需要从站点下载一些配置文件，单元测试在使用 silverlight tooltik(http://silverlight.codeplex.com/)时ok，使用statlight(http://statlight.codeplex.com/)时会发生错误，原因是statlight模拟了一个webserver，而这个模拟的webserver不支持文件下载。因此下载statlight代码对其进行了改进。修改位置：Statlight.Core/WebServer/ResponseFactory.cs修改后代码注意：1.在运行测试时要注意项目的启动目录2.以</summary><published>2011-02-12T03:36:00Z</published><updated>2011-02-12T03:36:00Z</updated><author><name>yahle</name><uri>http://www.cnblogs.com/yahle/</uri></author><link rel="alternate" href="http://www.cnblogs.com/yahle/archive/2011/02/12/1952209.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/yahle/archive/2011/02/12/1952209.html"/><content type="html">&lt;p&gt;起因：在写silverlight的功能时，需要从站点下载一些配置文件，单元测试在使用 silverlight tooltik(&lt;a href="http://silverlight.codeplex.com/"&gt;http://silverlight.codeplex.com/&lt;/a&gt;)时ok，使用statlight(&lt;a href="http://statlight.codeplex.com/"&gt;http://statlight.codeplex.com/&lt;/a&gt;)时会发生错误，原因是statlight模拟了一个webserver，而这个模拟的webserver不支持文件下载。因此下载statlight代码对其进行了改进。&lt;/p&gt;&#xD;
&lt;p&gt;修改位置：Statlight.Core/WebServer/ResponseFactory.cs&lt;/p&gt;&#xD;
&lt;p&gt;&lt;div onclick="cnblogs_code_show('510a9e14-c88a-475a-957a-189b16106f15')" style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;div  id="cnblogs_code_open_510a9e14-c88a-475a-957a-189b16106f15"&gt;&#xD;
&lt;pre&gt;&lt;div&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt;&lt;span style="color: #000000;"&gt; System;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt;&lt;span style="color: #000000;"&gt; System.Globalization;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt;&lt;span style="color: #000000;"&gt; System.IO;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt;&lt;span style="color: #000000;"&gt; System.Threading;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt;&lt;span style="color: #000000;"&gt; StatLight.Core.Configuration;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt;&lt;span style="color: #000000;"&gt; StatLight.Core.Properties;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt;&lt;span style="color: #000000;"&gt; StatLight.Core.Serialization;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;namespace&lt;/span&gt;&lt;span style="color: #000000;"&gt; StatLight.Core.WebServer&lt;br /&gt;{&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;class&lt;/span&gt;&lt;span style="color: #000000;"&gt; ResponseFactory&lt;br /&gt;    {&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;private&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;readonly&lt;/span&gt;&lt;span style="color: #000000;"&gt; Func&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;byte&lt;/span&gt;&lt;span style="color: #000000;"&gt;[]&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt; _xapToTestFactory;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;private&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;readonly&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;byte&lt;/span&gt;&lt;span style="color: #000000;"&gt;[] _hostXap;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;private&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;readonly&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;&lt;span style="color: #000000;"&gt; _serializedConfiguration;&lt;br /&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt; ResponseFactory(Func&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;byte&lt;/span&gt;&lt;span style="color: #000000;"&gt;[]&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt; xapToTestFactory, &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;byte&lt;/span&gt;&lt;span style="color: #000000;"&gt;[] hostXap, ClientTestRunConfiguration clientTestRunConfiguration)&lt;br /&gt;        {&lt;br /&gt;            _xapToTestFactory &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; xapToTestFactory;&lt;br /&gt;            _hostXap &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; hostXap;&lt;br /&gt;            _serializedConfiguration &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; clientTestRunConfiguration.Serialize();&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;private&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;static&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt; _htmlPageInstanceId &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt; ResponseFile Get(&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;&lt;span style="color: #000000;"&gt; localPath)&lt;br /&gt;        {&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; (IsKnown(localPath, StatLightServiceRestApi.CrossDomain))&lt;br /&gt;                &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; ResponseFile { FileData &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; Resources.CrossDomain.ToByteArray(), ContentType &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;text/xml&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt; };&lt;br /&gt;&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; (IsKnown(localPath, StatLightServiceRestApi.ClientAccessPolicy))&lt;br /&gt;                &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; ResponseFile { FileData &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; Resources.ClientAccessPolicy.ToByteArray(), ContentType &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;text/xml&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt; };&lt;br /&gt;&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; (IsKnown(localPath, StatLightServiceRestApi.GetHtmlTestPage))&lt;br /&gt;            {&lt;br /&gt;                &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; GetTestHtmlPage();&lt;br /&gt;            }&lt;br /&gt;&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; (IsKnown(localPath, StatLightServiceRestApi.GetXapToTest))&lt;br /&gt;                &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; ResponseFile { FileData &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; _xapToTestFactory(), ContentType &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;application/x-silverlight-app&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt; };&lt;br /&gt;&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; (IsKnown(localPath, StatLightServiceRestApi.GetTestPageHostXap))&lt;br /&gt;                &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; ResponseFile { FileData &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; _hostXap, ContentType &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;application/x-silverlight-app&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt; };&lt;br /&gt;&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; (IsKnown(localPath, StatLightServiceRestApi.GetTestRunConfiguration))&lt;br /&gt;                &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; ResponseFile { FileData &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; _serializedConfiguration.ToByteArray(), ContentType &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;text/xml&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt; };&lt;br /&gt;&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; (IsLocalFile(localPath))&lt;br /&gt;                &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; ResponseFile { FileData &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; File.ReadAllBytes(localPath), ContentType &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;text&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt; };&lt;br /&gt;&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;throw&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; NotImplementedException();&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        [System.Diagnostics.CodeAnalysis.SuppressMessage(&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Microsoft.Performance&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;, &lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;CA1822:MarkMembersAsStatic&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;)]&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;bool&lt;/span&gt;&lt;span style="color: #000000;"&gt; IsKnownFile(&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;&lt;span style="color: #000000;"&gt; localPath)&lt;br /&gt;        {&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; (IsKnown(localPath, StatLightServiceRestApi.CrossDomain))&lt;br /&gt;                &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;true&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; (IsKnown(localPath, StatLightServiceRestApi.ClientAccessPolicy))&lt;br /&gt;                &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;true&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; (IsKnown(localPath, StatLightServiceRestApi.GetHtmlTestPage))&lt;br /&gt;                &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;true&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; (IsKnown(localPath, StatLightServiceRestApi.GetXapToTest))&lt;br /&gt;                &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;true&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; (IsKnown(localPath, StatLightServiceRestApi.GetTestPageHostXap))&lt;br /&gt;                &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;true&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; (IsKnown(localPath, StatLightServiceRestApi.GetTestRunConfiguration))&lt;br /&gt;                &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;true&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; IsLocalFile(localPath);&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;        [System.Diagnostics.CodeAnalysis.SuppressMessage(&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Microsoft.Design&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;, &lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;CA1024:UsePropertiesWhereAppropriate&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;)]&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;static&lt;/span&gt;&lt;span style="color: #000000;"&gt; ResponseFile GetTestHtmlPage()&lt;br /&gt;        {&lt;br /&gt;            var page &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; Resources.TestPage.Replace(&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;BB86D193-AD39-494A-AEB7-58F948BA5D93&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;, _htmlPageInstanceId.ToString(CultureInfo.InvariantCulture));&lt;br /&gt;&lt;br /&gt;            Interlocked.Increment(&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;ref&lt;/span&gt;&lt;span style="color: #000000;"&gt; _htmlPageInstanceId);&lt;br /&gt;&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; ResponseFile { FileData &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; page.ToByteArray(), ContentType &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;text/html&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt; };&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;private&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;static&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;bool&lt;/span&gt;&lt;span style="color: #000000;"&gt; IsKnown(&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;&lt;span style="color: #000000;"&gt; filea, &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;&lt;span style="color: #000000;"&gt; fileb)&lt;br /&gt;        {&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;&lt;span style="color: #000000;"&gt;.Equals(filea, fileb, StringComparison.OrdinalIgnoreCase);&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;static&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;void&lt;/span&gt;&lt;span style="color: #000000;"&gt; Reset()&lt;br /&gt;        {&lt;br /&gt;            _htmlPageInstanceId &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; &lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; 本地文件是否存在&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; &lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; &lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;param name="path"&amp;gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; &lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt;&lt;/span&gt;&lt;span style="color: #808080;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;static&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;bool&lt;/span&gt;&lt;span style="color: #000000;"&gt; IsLocalFile(&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;&lt;span style="color: #000000;"&gt; path)&lt;br /&gt;        {&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; File.Exists(path);&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;注意：&lt;/p&gt;&#xD;
&lt;p&gt;1.在运行测试时要注意项目的启动目录&lt;/p&gt;&#xD;
&lt;p&gt;2.以及 silverlight 端只能使用相对路径访问。&lt;/p&gt;&lt;img src="http://www.cnblogs.com/yahle/aggbug/1952209.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/yahle/archive/2011/02/12/1952209.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/yahle/archive/2010/08/25/1807946.html</id><title type="text">给winform的Combox绑定枚举类型</title><summary type="text">网上搜索到一些代码，感觉不合适自己写了一个。  用于绑定的枚举泛型  然后在初始化的时候，把枚举类型绑定到DataSource里就行。 注意，需要设置combox的DisplayMember和ValueMember，可以在代码里设置，也可以直接在属性框里设置。同时，也可以在Combox里绑定上对应的值对象，需要将bindingSource里的对应变量绑定到SelectedValue里，绑定到sel...</summary><published>2010-08-25T02:51:00Z</published><updated>2010-08-25T02:51:00Z</updated><author><name>yahle</name><uri>http://www.cnblogs.com/yahle/</uri></author><link rel="alternate" href="http://www.cnblogs.com/yahle/archive/2010/08/25/1807946.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/yahle/archive/2010/08/25/1807946.html"/><content type="html">&lt;p&gt;网上搜索到一些代码，感觉不合适自己写了一个。&lt;/p&gt; &lt;p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;" onclick="cnblogs_code_show('b3d618e6-4c57-4fb2-9c73-11170d4d3d05')"&gt;&lt;br /&gt;Code highlighting produced by Actipro CodeHighlighter (freeware)&lt;br /&gt;http://www.CodeHighlighter.com/&lt;br /&gt;&lt;br /&gt;--&gt;&lt;span style="color: #000000"&gt;    &lt;/span&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt; &lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br&gt;    &lt;/span&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt; 用于Combox显示绑定的对象&lt;br&gt;    &lt;/span&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt; &lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;span style="color: #808080"&gt;&lt;br&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;class&lt;/span&gt;&lt;span style="color: #000000"&gt; BindComboxEnumType&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000"&gt;T&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br&gt;    {&lt;br&gt;        &lt;/span&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt; &lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br&gt;        &lt;/span&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt; 类型的名字&lt;br&gt;        &lt;/span&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt; &lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;span style="color: #808080"&gt;&lt;br&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;string&lt;/span&gt;&lt;span style="color: #000000"&gt; Name { &lt;/span&gt;&lt;span style="color: #0000ff"&gt;get&lt;/span&gt;&lt;span style="color: #000000"&gt;; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;set&lt;/span&gt;&lt;span style="color: #000000"&gt;; }&lt;br&gt;&lt;br&gt;        &lt;/span&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt; &lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br&gt;        &lt;/span&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt; 类型&lt;br&gt;        &lt;/span&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt; &lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;span style="color: #808080"&gt;&lt;br&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt;&lt;span style="color: #000000"&gt; T Type { &lt;/span&gt;&lt;span style="color: #0000ff"&gt;get&lt;/span&gt;&lt;span style="color: #000000"&gt;; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;set&lt;/span&gt;&lt;span style="color: #000000"&gt;; }&lt;br&gt;&lt;br&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;private&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;static&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;readonly&lt;/span&gt;&lt;span style="color: #000000"&gt; List&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000"&gt;BindComboxEnumType&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000"&gt;T&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt; bindTyps;&lt;br&gt;&lt;br&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;static&lt;/span&gt;&lt;span style="color: #000000"&gt; BindComboxEnumType()&lt;br&gt;        {&lt;br&gt;            bindTyps &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&lt;span style="color: #000000"&gt; List&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000"&gt;BindComboxEnumType&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000"&gt;T&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;();&lt;br&gt;&lt;br&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;foreach&lt;/span&gt;&lt;span style="color: #000000"&gt;(var name &lt;/span&gt;&lt;span style="color: #0000ff"&gt;in&lt;/span&gt;&lt;span style="color: #000000"&gt; Enum.GetNames(&lt;/span&gt;&lt;span style="color: #0000ff"&gt;typeof&lt;/span&gt;&lt;span style="color: #000000"&gt;(T)))&lt;br&gt;            {&lt;br&gt;                bindTyps.Add(&lt;/span&gt;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&lt;span style="color: #000000"&gt; BindComboxEnumType&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000"&gt;T&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;()&lt;br&gt;                                 {&lt;br&gt;                                     Name &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; name,&lt;br&gt;                                     Type &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; (T)Enum.Parse(&lt;/span&gt;&lt;span style="color: #0000ff"&gt;typeof&lt;/span&gt;&lt;span style="color: #000000"&gt;(T), name)&lt;br&gt;                                 });&lt;br&gt;            }&lt;br&gt;        }&lt;br&gt;&lt;br&gt;        &lt;/span&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt; &lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br&gt;        &lt;/span&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt; 绑定的类型数据&lt;br&gt;        &lt;/span&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt;&lt;span style="color: #008000"&gt; &lt;/span&gt;&lt;span style="color: #808080"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;span style="color: #808080"&gt;&lt;br&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;static&lt;/span&gt;&lt;span style="color: #000000"&gt; List&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000"&gt;BindComboxEnumType&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000"&gt;T&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt; BindTyps&lt;br&gt;        {&lt;br&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;get&lt;/span&gt;&lt;span style="color: #000000"&gt; { &lt;/span&gt;&lt;span style="color: #0000ff"&gt;return&lt;/span&gt;&lt;span style="color: #000000"&gt; bindTyps; }&lt;br&gt;        }&lt;br&gt;    }&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&#xD;
&lt;p&gt;&lt;/p&gt;然后在初始化的时候，把枚举类型绑定到DataSource里就行。 &#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;div &gt;&lt;pre &gt;/// &amp;lt;summary&amp;gt;&#xD;
        /// 控件初始化&#xD;
        /// &amp;lt;/summary&amp;gt;&#xD;
        /// &amp;lt;param name="sender"&amp;gt;&amp;lt;/param&amp;gt;&#xD;
        /// &amp;lt;param name="e"&amp;gt;&amp;lt;/param&amp;gt;&#xD;
        private void UCMessage_Load(object sender, EventArgs e)&#xD;
        {&#xD;
            cPlusTypeBindTypeBindingSource.DataSource = BindComboxEnumType&amp;lt;CPlusType&amp;gt;.BindTyps;&#xD;
            cbDirection.DataSource = BindComboxEnumType&amp;lt;MessageDirection&amp;gt;.BindTyps;&#xD;
            cbDirection.DisplayMember = "Name";&#xD;
            cbDirection.ValueMember = "Type";&#xD;
        }&#xD;
&#xD;
&lt;/pre&gt;&lt;/div&gt;&#xD;
&lt;p&gt;注意，需要设置combox的DisplayMember和ValueMember，可以在代码里设置，也可以直接在属性框里设置。同时，也可以在Combox里绑定上对应的值对象，需要将bindingSource里的对应变量绑定到SelectedValue里，绑定到selectedItem会出错。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/yahle/WindowsLiveWriter/winformCombox_9981/image_2.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/yahle/WindowsLiveWriter/winformCombox_9981/image_thumb.png" width="353" height="253"&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/yahle/aggbug/1807946.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/yahle/archive/2010/08/25/1807946.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/yahle/archive/2010/08/23/1806700.html</id><title type="text">单一世界十万在线webgame的设计思路（五）-- 整体架构和总结</title><summary type="text">总结： 虽然对于单一世界的webgame思考了很多，但到最后细化写成文字，也就只有这4篇短文。不是说不想深入细节去讨论，而是发现如果不做一些具体开发就没法深入写下去，因此本系列文章页就在这里点到即止，希望能给大家一些启发。 文章汇总：单一世界十万在线webgame的设计思路（一）-- 服务器数量预估单一世界十万在线webgame的设计思路（二）--数据库表结构划分单一世界十万在线webgame的设...</summary><published>2010-08-23T09:54:00Z</published><updated>2010-08-23T09:54:00Z</updated><author><name>yahle</name><uri>http://www.cnblogs.com/yahle/</uri></author><link rel="alternate" href="http://www.cnblogs.com/yahle/archive/2010/08/23/1806700.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/yahle/archive/2010/08/23/1806700.html"/><content type="html">&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/yahle/WindowsLiveWriter/webgame_FBA7/image_2.png"&gt;&lt;img height="983" width="863" src="http://images.cnblogs.com/cnblogs_com/yahle/WindowsLiveWriter/webgame_FBA7/image_thumb.png" alt="image" border="0" title="image" style="display: block; float: none; margin-left: auto; margin-right: auto; border-width: 0px;" /&gt;&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;总结：&lt;/p&gt;&#xD;
&lt;p&gt;虽然对于单一世界的webgame思考了很多，但到最后细化写成文字，也就只有这4篇短文。不是说不想深入细节去讨论，而是发现如果不做一些具体开发就没法深入写下去，因此本系列文章页就在这里点到即止，希望能给大家一些启发。 &lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;文章汇总：&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;a href="http://www.cnblogs.com/yahle/archive/2010/08/16/1800867.html"&gt;单一世界十万在线webgame的设计思路（一）-- 服务器数量预估&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;a href="http://www.cnblogs.com/yahle/archive/2010/08/16/1800869.html"&gt;单一世界十万在线webgame的设计思路（二）--数据库表结构划分&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;a href="http://www.cnblogs.com/yahle/archive/2010/08/20/1804783.html"&gt;单一世界十万在线webgame的设计思路（三）--地图模块设计思路&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;a href="http://www.cnblogs.com/yahle/archive/2010/08/23/1806694.html"&gt;单一十万在线webgame的设计思路（四）-- 玩家数据的数据库设计&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;a href="http://www.cnblogs.com/yahle/archive/2010/08/23/1806700.html"&gt;单一世界十万在线webgame的设计思路（五）-- 整体架构和总结&lt;/a&gt;&lt;a href="http://www.cnblogs.com/yahle/archive/2010/08/23/1806700.html"&gt;&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/yahle/aggbug/1806700.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/yahle/archive/2010/08/23/1806700.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/yahle/archive/2010/08/23/1806694.html</id><title type="text">单一世界十万在线webgame的设计思路（四）-- 玩家数据的数据库设计</title><summary type="text">数据库的划分 在游戏里数据交互最频繁的还是玩家的数据，他的访问量是一台服务器所不能解决的，因此我们考虑将这部分数据分担到多台服务器里。分担的方法还是做水平切割，但这次不使用数据库自身的切割功能，而是在应用逻辑层上对数据库进行切割。根据用户的ID取模后写入对应的服务器里。服务器1  用户ID % 服务器数量 = 0服务器2  用户ID % 服务器数量 = 1&amp;hellip;&amp;hellip; 预计每台...</summary><published>2010-08-23T09:46:00Z</published><updated>2010-08-23T09:46:00Z</updated><author><name>yahle</name><uri>http://www.cnblogs.com/yahle/</uri></author><link rel="alternate" href="http://www.cnblogs.com/yahle/archive/2010/08/23/1806694.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/yahle/archive/2010/08/23/1806694.html"/><content type="html">&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&lt;strong&gt;数据库的划分&lt;/strong&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;在游戏里数据交互最频繁的还是玩家的数据，他的访问量是一台服务器所不能解决的，因此我们考虑将这部分数据分担到多台服务器里。分担的方法还是做水平切割，但这次不使用数据库自身的切割功能，而是在应用逻辑层上对数据库进行切割。根据用户的ID取模后写入对应的服务器里。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;table cellpadding="0" cellspacing="0"&gt;&#xD;
&lt;tbody&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td&gt;&#xD;
&lt;p&gt;服务器1  &lt;/p&gt;&#xD;
&lt;p&gt;用户ID % 服务器数量 = 0&lt;/p&gt;&#xD;
&lt;/td&gt;&#xD;
&lt;/tr&gt;&#xD;
&lt;/tbody&gt;&#xD;
&lt;/table&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;table cellpadding="0" cellspacing="0"&gt;&#xD;
&lt;tbody&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td&gt;&#xD;
&lt;p&gt;服务器2  &lt;/p&gt;&#xD;
&lt;p&gt;用户ID % 服务器数量 = 1&lt;/p&gt;&#xD;
&lt;/td&gt;&#xD;
&lt;/tr&gt;&#xD;
&lt;/tbody&gt;&#xD;
&lt;/table&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&amp;hellip;&amp;hellip;&lt;/p&gt;&#xD;
&lt;p&gt;预计每台服务器能提供6k~8k的在线用户访问，预计一共需要16台服务器。考虑到服务器的进一步扩容问题，在初期规划时，建议规划为32个数据库，每台服务器可以先放3~5个数据库，等服务器用户人数上来后，再将数据库拆分到不同的服务器里。  &lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&lt;strong&gt;用户数据库各个模块的设计&lt;/strong&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;玩家基地里的建筑物，资源，物品，英雄等相关表，基本上都是玩家独立拥有的，不存在和其他玩家交互的情况，因此这些表的设计继续沿用之前的设计就可以了。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;军事模块&lt;/strong&gt;  &lt;/p&gt;&#xD;
&lt;p&gt;军事模块分为部队表，部队创建事件表和战斗事件表。部队表和部队创建事件都是玩家自己内部的事情，把相关的数据和玩家其他数据放在一个数据库里就行了，但是战斗事件表则会设计到两位或者多为玩家则会比较复杂一些。  &lt;/p&gt;&#xD;
&lt;p&gt;战斗事件表通常记录的是A玩家（城池）对B玩家（城池）的攻击，里面有攻击部队，到达时间等信息。这个条记录和A放在一起，那么B在查询自己被攻击的记录时，就需要访问32个数据库，反之，和B放在一起，这A查询自己部队的攻击情况时，就需要遍历32个数据库。如果和用户表一样单独把这张表拿出来，用单独的一个服务器来处理，则会导致表过大，查询会变慢以及战斗服务器的压力过大。  &lt;/p&gt;&#xD;
&lt;p&gt;在之前的项目，战斗服务器处理每场战斗大约是100ms，也就是每秒能处理10场战斗。当然你也许说可以用多线程来进行，但是使用多线程后，战斗事件的顺序可能会点到，影响用户的战术安排。  &lt;/p&gt;&#xD;
&lt;p&gt;在这里，我设想，将一个表设计改为2个表：攻击事件表和被攻击事件表。这两个表的结构一样。加入A玩家发起对B玩家的攻击，那么将攻击事件加入A玩家所在服务器里的攻击事件表，在B玩家服务器里，将数据插入被攻击事件表。然后每个数据库对应一个战斗服务器程序，这个程序在已被攻击事件表为依据，进行攻击计算。在计算完成后，在同时删除2个表里的数据。  &lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;好友模块&lt;/strong&gt;  &lt;/p&gt;&#xD;
&lt;p&gt;好友表本身就可以分为2个表，已某位玩家ID为主键和对应玩家放在同一个数据库里。但是好友申请则需要另外考虑了。如果申请的申请方不可见自己发出的申请，则只需把申请记录和被申请玩家放在一个数据里。但如果需要可见，则会麻烦一些，一种方法是参考战斗表的设计思路，分为申请表和被申请表。还有一种方法就是把申请表独立出来，所用用户的申请都放在这张表里。作为我个人，我倾向于后面的一种方法。  &lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;用户邮件表设计&lt;/strong&gt;  &lt;/p&gt;&#xD;
&lt;p&gt;用户邮件虽然是属于2位用户之间的交互数据，但从整个系统的角度上来说，用单一的一张表放在单独的服务器里会更简单一些。因为邮件表的内容基本为只读内容，只存在插入和读取功能，并且用户访问的频率不是很高，可以很方便的在逻辑层和web层作缓存。&lt;/p&gt;&lt;img src="http://www.cnblogs.com/yahle/aggbug/1806694.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/yahle/archive/2010/08/23/1806694.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/yahle/archive/2010/08/20/1804783.html</id><title type="text">单一世界十万在线webgame的设计思路（三）--地图模块设计思路</title><summary type="text">地图模块： 地图在传统策略类webgame里都是以平面的方式展示和存储的。地图的移动都是在这个平面上实现。但一般来说，平面地图的设计容量都会有一个上限，一般来地图多为400*400，他的人数上限就是16w，实际上服务器容纳3~5w人后，整张地图就会显得很拥挤了。如果要想容纳几百万人在线，平面地图的尺寸就需要扩容得相当大了，这样玩家从地图中间移动到边缘的时间会相当恐怖，因此平面地图在这里不是很合适。...</summary><published>2010-08-20T09:26:00Z</published><updated>2010-08-20T09:26:00Z</updated><author><name>yahle</name><uri>http://www.cnblogs.com/yahle/</uri></author><link rel="alternate" href="http://www.cnblogs.com/yahle/archive/2010/08/20/1804783.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/yahle/archive/2010/08/20/1804783.html"/><content type="html">&lt;div&gt; &lt;p&gt;&lt;span style="line-height: 31px; font-size: 21px; font-weight: bold"&gt;&lt;strong&gt;&lt;br&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="line-height: 31px; font-size: 21px; font-weight: bold"&gt;&lt;strong&gt;地图模块：&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt; &lt;p&gt;地图在传统策略类webgame里都是以平面的方式展示和存储的。地图的移动都是在这个平面上实现。但一般来说，平面地图的设计容量都会有一个上限，一般来地图多为400*400，他的人数上限就是16w，实际上服务器容纳3~5w人后，整张地图就会显得很拥挤了。如果要想容纳几百万人在线，平面地图的尺寸就需要扩容得相当大了，这样玩家从地图中间移动到边缘的时间会相当恐怖，因此平面地图在这里不是很合适。因此，地图不能用平面来构造，必须是立体的方法构造。在这里我设计了两组方案：&lt;/p&gt; &lt;p&gt;&lt;strong&gt;&lt;strong&gt;立体平面空间：&lt;/strong&gt;&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/yahle/WindowsLiveWriter/webgame_F21C/image_2.png"&gt;&lt;img title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/yahle/WindowsLiveWriter/webgame_F21C/image_thumb.png" width="432" height="278"&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;如上图所描述的，立体平面空间，就是把多块地图一层层叠加在一起，形成一个立体的空间。这样如果用户不够，再增加一个新的平面就行。游戏的背景可以根据需要做调整（例如整个世界是被大海隔开的5片大陆组成，在这5片大陆之外，还有其它的超位面空间，这些空间自身是互不相连的，但是可以通过传送阵进行位面传送）。这样做的好处是，用户容易理解，以往用户的操作习惯不用改变，毕竟都是在平面地图上战斗。只不过要做跨位面的战斗的移动计算上会存在问题（逻辑上的问题：是否允许跨大陆的远征军）&lt;/p&gt; &lt;p&gt;用户坐标的表示方法：地图层次、x坐标、y坐标&lt;/p&gt; &lt;p&gt;数据库设计方案：&lt;/p&gt; &lt;p&gt;采用了层次结构，只需要增加一个地图层次的字段，这个地图表就能沿用。（参考字段：ID、地图层次、X坐标、y坐标、地图类型、玩家ID、城池ID）&lt;/p&gt; &lt;p&gt;虽然说，加入了一个地图层次的字段能解决地图的表示问题，不过，因为整个游戏世界是单一世界的服务器，当所用地图信息存储到一张表的时候，这数据量就不容小视。在这之前做webgame项目的时候，整张地图是预先生成好数据库记录的，当有玩家加入游戏的时候，就去修改表里的玩家ID和城池ID。同时因为地图大小只有400*400，整张表也就16w条记录。但如果是要做一个承载500w人的服务器，那地图的尺寸最好是要800*800，并且地图的层次为15~20层，就算最小的15层，按照原先的设计思路，至少需要预先插入960w条记录。&lt;/p&gt; &lt;p&gt;数据量看上去比较夸张，不过对于SqlServer来说也不是处理不了，并且我们还将计划把地图表单独用一台服务器来处理，其压力远小很多。不过也不能不考虑当发生性能瓶颈时的优化处理。优化的方法有两个：&lt;/p&gt; &lt;p&gt;1． 拆分：按照地图层次，把这张表拆分成15~20张表，或者拆分到15~20个数据库里&lt;/p&gt; &lt;p&gt;2． 用疏矩阵存储：地图不预先生成用户的地图信息，而是有玩家加入时才插入数据。这个方案在服务器早期人数比较少时会得到良好的性能效果，但当用户人数达到一定量时，还是避免不了因为记录函数过多而导致而外的开销。&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;&lt;strong&gt;&lt;strong&gt;全立体空间：&lt;/strong&gt;&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/yahle/WindowsLiveWriter/webgame_F21C/image_4.png"&gt;&lt;img title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/yahle/WindowsLiveWriter/webgame_F21C/image_thumb_1.png" width="349" height="297"&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;全立体空间就是取消了平面的坐标显示，用户都是在一个三维的立体地图里战斗。好处是地图不用那么分散，在移动计算让很好处理，存在的问题就是游戏在显示的时候，如何表现地图的三维效果会比较困难。&lt;/p&gt; &lt;p&gt;用户坐标的表示方式：x坐标 y坐标 z坐标&lt;/p&gt; &lt;p&gt;数据库存储方案：&lt;/p&gt; &lt;p&gt;三维空间的数据库表设计结构可以和上面的表一样，而且也只能采用疏矩阵的方式存储，因为做成三维空间后，可表示的位置的记录数更多了。&lt;/p&gt; &lt;p&gt;&lt;p&gt;&lt;p&gt;&lt;strong&gt;&lt;strong&gt;可移动基地在全立体空间的设想：&lt;/strong&gt;&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;早在两年前，看过《超时空要塞F》的时候，就产生了一个想法&lt;a href="http://www.cnblogs.com/yahle/archive/2008/05/27/1208355.html"&gt;http://www.cnblogs.com/yahle/archive/2008/05/27/1208355.html&lt;/a&gt;，就是玩家的基地是可以移动的。玩家的母舰在游戏的过程中，已一定的速度在整个世界里移动。  &lt;p&gt;可以移动体系的设计要点：  &lt;p&gt;1. 用户的基地可移动  &lt;p&gt;2. 用户基地只能拥有一个（武林三国、travian都能建立多个）  &lt;p&gt;3. 空间坐标由x坐标 y坐标 z坐标 组成，并且坐标的值应为小数  &lt;p&gt;4. 同一个坐标里运行多个玩家存在，玩家的航线交叉并不会造成影响（只是为了方便计算减少判断过程）  &lt;p&gt;5. 移动的数据通过后台定时刷新  &lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt; &lt;p&gt;a) 每个短周期(1~60s)在内存里更新坐标&lt;/p&gt;&lt;/blockquote&gt; &lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt; &lt;p&gt;b) 每个长周期（10~100个短周期时间）将坐标的数据更新的数据库&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;6. 攻击舰队移动的时间是按照2个阶段来进行的  &lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt; &lt;p&gt;a) 第一个阶段是从母舰移动到目标坐标的时间&lt;/p&gt;&lt;/blockquote&gt; &lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt; &lt;p&gt;b) 第二个阶段，在快到达时（前60分钟），做一个判断，判断攻击舰队的雷达能否搜索到目标的母舰坐标，能则做攻击坐标的新修正，如果不能则继续按照原先的坐标点移动。以上判断将每隔1分钟做一次，直到到达目标坐标点。如果到达目标坐标点仍然无法视为攻击失败，舰队返回&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;7. 舰队的移动距离和舰队所携带的能量有关，超过移动范围的坐标，舰队是无法出发的。  &lt;p&gt;8. 部队和母舰应该是可以进行空间跳跃实现长距离的移动，不过空间跳跃需要在制定地点消耗大量的能量才能实现。  &lt;p&gt;9. 默认情况下，母舰移动速度为1格（x、y、z坐标）/天。  &lt;p&gt;10. 默认舰队的雷达查询范围为1格  &lt;p&gt;11. 默认母舰的雷达查询范围为3格  &lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;img src="http://www.cnblogs.com/yahle/aggbug/1804783.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/yahle/archive/2010/08/20/1804783.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/yahle/archive/2010/08/16/1800869.html</id><title type="text">单一世界十万在线webgame的设计思路（二）--数据库表结构划分</title><summary type="text">数据库表设计： 因为要把这么多访问量分担到不同的服务器里，原先的数据库表设计肯定不会合适。初步的想法是根据游戏的逻辑模块，将不同模块的数据库表拆分到各个服务器里，如果按照上面的服务器预估得到的结论是4~6组服务器，实际上这个方案还是可行的。但如果是20组服务器的话，除非是一台服务器一张数据库表，但这的设计会造成数据表太分散，在处理事务的时候，会跨多个数据库  策略类webgame一般的主要模块为：...</summary><published>2010-08-16T09:13:00Z</published><updated>2010-08-16T09:13:00Z</updated><author><name>yahle</name><uri>http://www.cnblogs.com/yahle/</uri></author><link rel="alternate" href="http://www.cnblogs.com/yahle/archive/2010/08/16/1800869.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/yahle/archive/2010/08/16/1800869.html"/><content type="html">&lt;div&gt; &lt;p&gt;&lt;b&gt;数据库表设计：&lt;/b&gt;&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;因为要把这么多访问量分担到不同的服务器里，原先的数据库表设计肯定不会合适。初步的想法是根据游戏的逻辑模块，将不同模块的数据库表拆分到各个服务器里，如果按照上面的服务器预估得到的结论是4~6组服务器，实际上这个方案还是可行的。但如果是20组服务器的话，除非是一台服务器一张数据库表，但这的设计会造成数据表太分散，在处理事务的时候，会跨多个数据库&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;策略类webgame一般的主要模块为：建筑物和资源、军事、英雄、物品、帮会、交易、地图。根据这些模块的应用场景，可以将数据库表分为2种类型，一种是属于玩家的数据，另外一种是公共数据。&lt;/p&gt; &lt;p&gt;1. 属于玩家的数据是指玩家个人说拥有的基地、资源、军事单位、物品等数据，它们都是围绕着玩家而产生的。&lt;/p&gt; &lt;p&gt;2．公共数据则是指由多位玩家共同组合而产生的数据，例如：账户信息、帮会、地图等。&lt;/p&gt; &lt;p&gt;这里划分两种数据的目的是在于他们的数据库表的划分。对于公共数据，则采用单一服务器，单一数据库表处理的方式来处理。例如帮会模块和地图模块就准备分别用3台服务器来存储各自对应的数据库表。而对于玩家的数据，则根据用户ID采用一定的划分方式，将玩家数据打散到各个服务器里（&lt;a href="http://blog.zhaojie.me/2010/03/sharding-by-id-characteristic.html"&gt;http://blog.zhaojie.me/2010/03/sharding-by-id-characteristic.html&lt;/a&gt;）。&lt;/p&gt; &lt;p align="center"&gt;&lt;img src="http://pic002.cnblogs.com/img/yahle/201008/2010082017282950.png"&gt;&lt;/p&gt; &lt;p align="center"&gt;（数据表的结构划分）&lt;/p&gt; &lt;p&gt;&lt;/p&gt;&lt;/div&gt; &lt;p&gt;&lt;strong&gt;&lt;strong&gt;用户表和其单表的设计思路：&lt;/strong&gt;&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;这里所说的单表是指在逻辑上部队数据库表做拆分，程序在访问时只访问一个数据库。当然这只是逻辑上的单一，根据实际上的访问压力，可以将数据库文件作水平切割分布在不同的文件分区和服务器里。这部分的数据库表设计继续沿用之前的设计方案就可以了。&lt;/p&gt; &lt;p&gt;对于用户信息，帮会信息等数据，实际上插入和更新的频率不会太高，更多的是在查询上，因此这部分的设计重点应该是在缓存上。从以前的资料里得知Memcache服务器每秒可以响应4w次的读请求，用一台Memcache就能处理好用户和帮会信息的缓存处理。&lt;/p&gt;&lt;img src="http://www.cnblogs.com/yahle/aggbug/1800869.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/yahle/archive/2010/08/16/1800869.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/yahle/archive/2010/08/16/1800867.html</id><title type="text">单一世界十万在线webgame的设计思路（一）-- 服务器数量预估</title><summary type="text">服务器数量预估 在线人数预估：  在项目设计之前，需要先对运营后的服务器人数做一下预估，预计激活人数300w，活跃人数40w，同时在线10w。而服务器的设计极限则在激活人数500w，活跃人数60w，最高同时在线15w。  数据参考： 这里之所以预计这么低的激活人数，是从整个服务器考虑的。《热血三国》是将不同的用户放在不同的服务器里，所以单一服务器的激活人数不会对服务器压力产生太大影响。而如果将所有...</summary><published>2010-08-16T09:10:00Z</published><updated>2010-08-16T09:10:00Z</updated><author><name>yahle</name><uri>http://www.cnblogs.com/yahle/</uri></author><link rel="alternate" href="http://www.cnblogs.com/yahle/archive/2010/08/16/1800867.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/yahle/archive/2010/08/16/1800867.html"/><content type="html">&lt;p&gt;&lt;strong&gt;服务器数量预估&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;&lt;b&gt;在线人数预估：&lt;/b&gt; &lt;/p&gt; &lt;p&gt;在项目设计之前，需要先对运营后的服务器人数做一下预估，预计激活人数300w，活跃人数40w，同时在线10w。而服务器的设计极限则在激活人数500w，活跃人数60w，最高同时在线15w。 &lt;/p&gt; &lt;p&gt;数据参考： &lt;/p&gt; &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/yahle/WindowsLiveWriter/webgame_F17F/image_2.png"&gt;&lt;img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/yahle/WindowsLiveWriter/webgame_F17F/image_thumb.png" width="562" height="460"&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;这里之所以预计这么低的激活人数，是从整个服务器考虑的。《热血三国》是将不同的用户放在不同的服务器里，所以单一服务器的激活人数不会对服务器压力产生太大影响。而如果将所有玩家统一到一组服务器里，则会导致用户表访问压力过大。偏低的激活人数靠定期清理不活跃账户来实现。 &lt;/p&gt; &lt;p&gt;&lt;b&gt;数据库服务器数量估计：&lt;/b&gt; &lt;/p&gt; &lt;p&gt;服务器在搭配上，一般分为db服务器和web服务器。在这之前的运营中，通常按照1:1的方式来配置数据库和web服务器，而实际情况可以使1:2的配置比例。不过在单一世界的设计里，单台db服务器肯定无法满足需求。之前设计过一款策略类webgame，在运营时，每秒sql数为在线人数的1~1.5倍。不过这个测试数据，是在没有钱全面应用缓存的情况的数据，在新系统里，如果全面应用缓存，并采用类似于Memcache的软件提供数据缓存，这样数据库的访问压力将可以得到极大的缓解，因此我们暂定吧每秒sql数暂定为在线人数的1倍。正常情况下数据库的访问压力应该为 10w sql/秒 极限数据应该为15w sql/秒。 &lt;/p&gt; &lt;p&gt;数据库使用ms sqlserver 2008，在这之前的一个策略类webgame项目，对一台CPU为 E5520核的服务器上做压力测试，得到的数据如下： &lt;/p&gt; &lt;table border="0" cellspacing="0" cellpadding="0"&gt; &lt;tbody&gt; &lt;tr&gt; &lt;td width="86"&gt; &lt;p&gt;Sql数&lt;/p&gt;&lt;/td&gt; &lt;td width="157"&gt; &lt;p&gt;5k&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td width="86"&gt; &lt;p&gt;CPU&lt;/p&gt;&lt;/td&gt; &lt;td width="157"&gt; &lt;p&gt;50%&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td width="86"&gt; &lt;p&gt;硬盘IO&lt;/p&gt;&lt;/td&gt; &lt;td width="157"&gt; &lt;p&gt;0.5M(突发3M）&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td width="86"&gt; &lt;p&gt;网卡流量&lt;/p&gt;&lt;/td&gt; &lt;td width="157"&gt; &lt;p&gt;30Mbit/s(100M网卡）&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;按照上面的分析，在正常情况下，我们需要为整个系统提供20台db。Web服务端按照1:1和db做搭配，也将安排20台，预计3个机柜的服务器。 &lt;/p&gt;&lt;img src="http://www.cnblogs.com/yahle/aggbug/1800867.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/yahle/archive/2010/08/16/1800867.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/yahle/archive/2010/06/08/1754250.html</id><title type="text">vs2010 命令行下用 msbuild 发布web站点</title><summary type="text">先来看一下原来 vs2008 的代码[代码]再看看 vs2010 的代码[代码]差别在于：1.msbuild需要用4.0的2.原先的 _CopyWebApplication 不支持，还为_WPPCopyWebApplication3.原先的 /p:OutputPath 不需要使用4.指定平台 /p:Platform=AnyCPU ，主要是有些项目可能是发布到64位平台，使用这个指令可以指定最终生成的目标平台</summary><published>2010-06-08T11:36:00Z</published><updated>2010-06-08T11:36:00Z</updated><author><name>yahle</name><uri>http://www.cnblogs.com/yahle/</uri></author><link rel="alternate" href="http://www.cnblogs.com/yahle/archive/2010/06/08/1754250.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/yahle/archive/2010/06/08/1754250.html"/><content type="html">&lt;p&gt;先来看一下原来 vs2008 的代码&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;&lt;div&gt;&lt;!--&lt;br /&gt;&lt;br /&gt;Code highlighting produced by Actipro CodeHighlighter (freeware)&lt;br /&gt;http://www.CodeHighlighter.com/&lt;br /&gt;&lt;br /&gt;--&gt;&lt;span style="color: #000000;"&gt;msbuild website\websiteApp.csproj &lt;/span&gt;&lt;span style="color: #000000;"&gt;/&lt;/span&gt;&lt;span style="color: #000000;"&gt;t:ResolveReferences;Compile &lt;/span&gt;&lt;span style="color: #000000;"&gt;/&lt;/span&gt;&lt;span style="color: #000000;"&gt;t:_CopyWebApplication &lt;/span&gt;&lt;span style="color: #000000;"&gt;/&lt;/span&gt;&lt;span style="color: #000000;"&gt;p:Configuration&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;Release &lt;/span&gt;&lt;span style="color: #000000;"&gt;/&lt;/span&gt;&lt;span style="color: #000000;"&gt;p:WebProjectOutputDir&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;r:\website &lt;/span&gt;&lt;span style="color: #000000;"&gt;/&lt;/span&gt;&lt;span style="color: #000000;"&gt;p:OutputPath&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;r:\website\bin&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;再看看 vs2010 的代码&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;&lt;div&gt;&lt;!--&lt;br /&gt;&lt;br /&gt;Code highlighting produced by Actipro CodeHighlighter (freeware)&lt;br /&gt;http://www.CodeHighlighter.com/&lt;br /&gt;&lt;br /&gt;--&gt;&lt;span style="color: #000000;"&gt;path C:\Windows\Microsoft.NET\Framework\v4.&lt;/span&gt;&lt;span style="color: #800080;"&gt;0.30319&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;msbuild website\websiteApp2010.csproj &lt;/span&gt;&lt;span style="color: #000000;"&gt;/&lt;/span&gt;&lt;span style="color: #000000;"&gt;t:ResolveReferences;Compile &lt;/span&gt;&lt;span style="color: #000000;"&gt;/&lt;/span&gt;&lt;span style="color: #000000;"&gt;t:_WPPCopyWebApplication &lt;/span&gt;&lt;span style="color: #000000;"&gt;/&lt;/span&gt;&lt;span style="color: #000000;"&gt;p:Configuration&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;Release &lt;/span&gt;&lt;span style="color: #000000;"&gt;/&lt;/span&gt;&lt;span style="color: #000000;"&gt;p:WebProjectOutputDir&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;r:\HitoSNS&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;差别在于：&lt;/p&gt;&#xD;
&lt;p&gt;1.msbuild需要用4.0的&lt;/p&gt;&#xD;
&lt;p&gt;2.原先的 _CopyWebApplication 不支持，还为_WPPCopyWebApplication&lt;/p&gt;&#xD;
&lt;p&gt;3.原先的 /p:OutputPath 不需要使用&lt;/p&gt;&#xD;
&lt;p&gt;4.指定平台 /p:Platform=AnyCPU ，主要是有些项目可能是发布到64位平台，使用这个指令可以指定最终生成的目标平台&lt;/p&gt;&lt;img src="http://www.cnblogs.com/yahle/aggbug/1754250.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/yahle/archive/2010/06/08/1754250.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/yahle/archive/2010/03/06/1679818.html</id><title type="text">c# 停止和开启 IIS 7.0 站点的方法</title><summary type="text">IIS6.0 的停止和启动方法参考http://www.cnblogs.com/yahle/archive/2008/03/25/1121518.html</summary><published>2010-03-06T10:07:00Z</published><updated>2010-03-06T10:07:00Z</updated><author><name>yahle</name><uri>http://www.cnblogs.com/yahle/</uri></author><link rel="alternate" href="http://www.cnblogs.com/yahle/archive/2010/03/06/1679818.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/yahle/archive/2010/03/06/1679818.html"/><content type="html">&lt;pre&gt;&lt;/pre&gt;&#xD;
&lt;pre&gt;代码需要引入一个 Microsoft.Web.Administration.dll，文件位置在 \Windows\System32\inetsrv 目录。&lt;/pre&gt;&#xD;
&lt;pre&gt;核心代码：&lt;/pre&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #808080;"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&#xD;
        &lt;span style="color: #808080;"&gt;/// 关闭其它站点，只开启输入名称的站点&lt;/span&gt;&#xD;
         &lt;span style="color: #808080;"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&#xD;
        &lt;span style="color: #808080;"&gt;/// &amp;lt;param name="startSiteName"&amp;gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&#xD;
        &lt;span style="color: #0000ff;"&gt;private&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;void&lt;/span&gt; StartWebsite(&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt; startSiteName)&#xD;
        {&#xD;
&#xD;
            var webManager = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; Microsoft.Web.Administration.ServerManager();&#xD;
            var startSite = webManager.Sites[startSiteName];&#xD;
            &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (startSite == &lt;span style="color: #0000ff;"&gt;null&lt;/span&gt;)&#xD;
            {&#xD;
                Console.WriteLine("&lt;span style="color: #8b0000;"&gt;Can't not find site:{0}&lt;/span&gt;", startSiteName);&#xD;
                &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;;&#xD;
            }&#xD;
&#xD;
            &lt;span style="color: #0000ff;"&gt;foreach&lt;/span&gt; (var site &lt;span style="color: #0000ff;"&gt;in&lt;/span&gt; webManager.Sites)&#xD;
            {&#xD;
                &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (site.Name != startSiteName)&#xD;
                    site.Stop();&#xD;
            }&#xD;
&#xD;
            startSite.Start();&#xD;
        }&lt;/pre&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;IIS6.0 的停止和启动方法参考&lt;/p&gt;&#xD;
&lt;p&gt;&lt;a title="http://www.cnblogs.com/yahle/archive/2008/03/25/1121518.html" href="http://www.cnblogs.com/yahle/archive/2008/03/25/1121518.html"&gt;http://www.cnblogs.com/yahle/archive/2008/03/25/1121518.html&lt;/a&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/yahle/aggbug/1679818.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/yahle/archive/2010/03/06/1679818.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/yahle/archive/2009/02/23/1396825.html</id><title type="text">web策略类游戏开发(六)缓存概述</title><summary type="text">既然是概述，就没有太多详细的东西，本文主要针对asp.net开发环境。webgame需要缓存的内容包括1.游戏的配置信息2.玩家的信息</summary><published>2009-02-23T14:36:00Z</published><updated>2009-02-23T14:36:00Z</updated><author><name>yahle</name><uri>http://www.cnblogs.com/yahle/</uri></author><link rel="alternate" href="http://www.cnblogs.com/yahle/archive/2009/02/23/1396825.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/yahle/archive/2009/02/23/1396825.html"/></entry></feed>
