CountryListBox ASP.NET Web控件,列出国家和自动检测访问者所在国家/地区

分享于 

10分钟阅读

Web开发

  繁體

介绍

本文的目的是演示如何创建更专业 下拉列表 Web控件- 特别用于显示国家/地区- 适用于 ASP.NET 网站窗体。 这是( 它不仅显示所有国家,而且在HTML中添加每一个都是非常)的主要优点,但它也会自动识别访问者所从的国家,这个国家的网站。

web控件使用来自 MaxMind的数据库,特别是它的 GeoIP免费数据库控件。 MaxMind还提供了一个 C# 类来访问它的数据库。

这是一个非常简单的控制,大部分的工作是由准备好的准备完成 CountryLookup 所以,最好的方法就是提供它如何工作的概述,以及实现详细信息。

就像以前一样,我的网站上有一个演示

使用指导

从广义上来说 CountryListBox web控件派生自 下拉列表 并将ASCII文本文件的内容添加到 CountryListBox ''s 项目 集合( 国家的List )。 MaxMind提供了 CountryLookup 类和该类是每个国家的字符串的array。创建一个用于将这里 array 内容转储到ASCII文本文件的实用程序。 部分 array 包括"n/a"和"匿名代理",这些内容从文本文件中删除。 这两个文件都包含在存档文件中,因此你不必担心创建这个文件。

当国家被加载到IP数据库以确定当前访问者的位置之后,在下拉 List 框中选择。 除了它的行为,它的行为 下拉列表 将控制。

现在,技术细节 behind GeoIP的MaxMind数据库( 由于 C# 类是由MaxMind提供的,所以不需要理解)。

MaxMind存储IP地址范围,每个记录也记录在一个国家/地区。 例如( CSV格式) "1029177344","1029439487","","澳大利亚" IP地址被计算为 ipnum = 16777216 *w + 65536 *x + 256 *y + z 例如要基于 24.24.24.24 计算IP数,请执行以下操作: 404232216 = 16777216 *24 + 65536 *24 + *24 + 24 这都是通过 CountryLookup 类--可以直接从MaxMind下载( 但包含在 CountryListBox 程序集)。

.有关实现的详细信息

控件的设计相对简单,大多数工作都是在 OnInit 重写。它的目的是将所有国家添加到控制集合的项目中,然后选择访问者从中获取的。

OnInit

下面是代码的一部分 OnInit 方法包括用于确定应用程序缓存是否应用于存储地理信息数据库( 这是通过 CountryListBox ''s CacheDatabase 属性。如果要使用缓存,并检测数据尚未存储,则将该文件加载到 MemoryStream 对象( 这是通过 FileToMemory static 方法- 这里方法被添加到 CountryLookup 这是我的课 MemoryStream 然后将对象存储在应用程序缓存中。


// Check to see if the application cache should be used


if (useAppCache)


{


 // Check to see whether the IP Database is


 // already in the Application Cache


 if (Context.Cache.Get("GeoIPData") == null)


 // No, so store it as well as setting a dependency on the file


 Context.Cache.Insert("GeoIPData",


 CountryLookup.FileToMemory(


 ConfigurationSettings.AppSettings["GeoDatFile"]),


 new CacheDependency


 (ConfigurationSettings.AppSettings["GeoDatFile"]));



iPhone 7 还没出来,我们已经在iPhone上获取细节 8,或者不管是想到下一步。 LoadCountries 方法,然后调用以填充 项目 将执行集合和查找,并选择匹配的国家/地区。


 // Load the countries from the ASCII file into the control


 LoadCountries();



 // Perform the lookup using the MemoryStream taken from the Cache


 CountryLookup cl = new CountryLookup(


 ((MemoryStream)Context.Cache.Get("GeoIPData"))


 );



 // What country is the visitor from?


 string visitorCountry = cl.lookupCountryName(


 this.Page.Request.ServerVariables["REMOTE_ADDR"]


 );



 // Select the country in the control


 this.SelectedIndex = this.Items.IndexOf(


 new ListItem(visitorCountry,visitorCountry)


 );


}



CountryLookup更改

iPhone 7 还没出来,我们已经在iPhone上获取细节 8,或者不管是想到下一步。 CountryLookup 类由MaxMind提供,因此为了对存储在内存中的数据库执行搜索,需要进行一些更改。 这是非常容易的,因为. NET's 流基础结构。

部署演示

在演示中,有一个测试网页表单。GeoIP数据库。国家文本文件和 CountryListBox 程序集结构已经准备好复制,但 Web.Config的内容必须更改才能反映不同的路径。 你可以随意将这些文件放在任何地方( 例如。 在公开访问文件结构之外,只需确保 ASP.NET 用户帐户具有必要的访问权限。

你需要做一些基本的事情来将控件添加到页面中,

  • 将导入语句添加到页的顶部:

<%@ Register TagPrefix="etier" Namespace="Etier" 



                         Assembly="CountryListBox" %>



  • 然后将标签添加到页面中,它应该支持任何标准 下拉列表 属性( 虽然我没有彻底测试过这些:) )

<etier:CountryListBox



  Id="MyListBox"



     RunAt="server"



  CacheDatabase=true



  CacheCountries=true



/>



效率

我在该控件上执行了一些有限的测试,以了解在加载时它是如何执行的。 我使用 Windows XP专业作为我的开发平台,它有限制版本的IIS - 限制为 10个同时连接。 我使用,测试来执行测试,这涉及到在 5分钟内加载演示页面的次数多次。

非缓存版本结果

图 below 使用标准控件( 没有任何缓存) 显示了测试的结果。 每次请求页面时,GeoIP数据库文件都会加载并搜索,这些国家也会从文本文件中加载。 图 below 是测试过程中记录的一些基本统计。


Average requests per second: 32.47


 Average time to first byte (msecs): 279.39 


 Average time to last byte (msecs): 279.55 



 Response Code: 403 - The server understood the request, but is refusing 


 to fulfill it. 


 Count: 5,429


 Percent (%): 55.73 



 Response Code: 200 - The request completed successfully. 


 Count: 4,313 


 Percent (%): 44.27



因为我的本地机器不是真正设计成服务器( 它是一个 of + 基于的机器,带有 512MB 个 RAM,但没有SCSI硬盘)的,所以假设一个专用服务器会更好地执行。 尽管如此,服务器每秒只能维持 32个请求的平均值。

缓存结果

为了提高性能,我使用 ASP.NET's 应用程序缓存来存储GeoIP数据库和。 使用这两个选项的选项可以通过 CacheDatabaseCacheCountries 我运行了测试脚本,结果显示了相当大的差异,。 同样,下面包含一些基本统计信息。


Average requests per second: 146.01 


 Average time to first byte (msecs): 43.48 


 Average time to last byte (msecs): 43.76 



 Response Code: 403 - The server understood the request, but is refusing 


 to fulfill it. 


 Count: 6 


 Percent (%): 0.01 



 Response Code: 200 - The request completed successfully. 


 Count: 43,797 


 Percent (%): 99.99



由于缓存每秒可以处理的请求数量已经从 32增加到 146,大约增加了 350 %.。

结束语

感谢每个Soderlind写一篇文章,首先告诉我maxmind数据库的GeoIP。 感谢MaxMind还必须提供免费的数据库。 它似乎免费的商业应用也是 --,但商业服务也提供了关于区域,状态,甚至NetBlock所有者。

创建一个非常简单的控件是非常简单的,但是它是非常有用的 ! 它应该能防止很多人错误地填写表单。 如果你有任何意见或者问题,请随时向我提供帮助,或者在下面发布一条。


控制  AUTO  asp-net  lis  列表  lists  
相关文章