要完成高性能的Web服务功能,通常都是需要用到服务,如:IIS、Apache、Tomcat和Nginx,但是众所周知的Web服务器配置的复杂性,如果我们只是需要一些简单的功能,安装这些组件看起来就没多大必要。我们需要的是一个简单的HTTP类,可以很容易地嵌入到简单的Web请求的服务,加到自己的程序里。

.net 框架下有一个简单但很强大的类 System.Net.HttpListener。这个类几行代码就能完成一个简单的服务器功能。

HttpListener listener = new HttpListener();
listener.Prefixes.Add("http://localhost:8081/");
listener.Start();
Console.WriteLine("Listening...");
Task task = Task.Factory.StartNew(() => {
	while(listener.IsListening)
	{
		HttpListenerContext context = listener.GetContext();
		Console.WriteLine("Http requesting...");
		HttpListenerRequest request = context.Request;
		HttpListenerResponse response = context.Response;
		Console.WriteLine("Http responseting...");
		string responseString = "<html><title>Http server in C#</title><body><p>Hello world!</p></body></html>";
		using (StreamWriter writer = new StreamWriter(response.OutputStream))
		{
			writer.WriteLine(responseString);
		}
	}
});
task.Wait();

结果

http server

C# 读取 CSV 文件数据到 DataTable。

public static DataTable ReadCSVtoDataTable(string fileName)
{
	DataTable dt = new DataTable();
	Regex regex = new Regex(",(?=(?:[^\"]*\"[^\"]*\")*[^\"]*$)");
	using (StreamReader sr = new StreamReader(fileName))
	{
		string[] headers = sr.ReadLine().Split(',');
		foreach (string header in headers)
		{
			dt.Columns.Add(header);
		}
		while (sr.Peek() > 0)
		{
			string[] rows = regex.Split(sr.ReadLine());
			DataRow dr = dt.NewRow();
			for (int i = 0; i < headers.Length; i++)
			{
				dr[i] = rows[i];
			}
			dt.Rows.Add(dr);
		}
	}
	return dt;
}

using (var client = new SftpClient("Host", 22, "UserName", "Password"))
{
	client.Connect();
	try
	{
		var data = File.ReadAllBytes("C:\\test.zip")
		using (SftpFileStream sw = client.OpenWrite("/home/test.zip"))
		{
			sw.Write(data, 0, data.Length);
		}
	}
	catch(Exception ex)
	{
		throw ex;
	}
	finally
	{
		client.Disconnect();
	}
}

DataTable 导出 CSV,支持.NET Framework 4.0以上。

public byte[] DataTableToCSV(DataTable data)
{
	StringBuilder sb = new StringBuilder();
	IEnumerable<string> columnNames = data.Columns.Cast<DataColumn>().
									  Select(column => column.ColumnName);
	sb.AppendLine(string.Join(",", columnNames));
	foreach (DataRow row in data.Rows)
	{
		IEnumerable<string> fields = row.ItemArray.Select(field =>
		  string.Concat("\"", field.ToString().Replace("\"", "\"\""), "\""));
		sb.AppendLine(string.Join(",", fields));
	}
	return System.Text.Encoding.Default.GetBytes(sb.ToString());
}

IP2Location for.net Standard 组件是一个基于 .net Standard 框架的软件开发组件和数据解决方案,它使您能够实时发现您的web访问者通过ip地址来自何处。然后您可以根据访问者的国家、地区、城市、纬度、经度、邮政编码、ISP、域名、时区、连接速度、IDD代码、区号、气象站代码、气象站名称、MCC、MNC、移动品牌名称、海拔和使用类型动态调整网站内容。

文件下载:

IP2Location 组件: https://down.24kplus.com/dev/IP2Location-1.0.0.0.zip

免费 IP2Location BIN 数据: https://lite.ip2location.com

商业 IP2Location BIN 数据:  https://www.ip2location.com/database/ip2location

要求

Microsoft .NET 4.0 framework 或更高 / Microsoft .NET Core 2.0 或更高。

方法

方法名
描述
Close
关闭并清理文件缓存
IPQuery
IP信息查询
Dispose
释放由 IP2Location 占用的资源。

属性

属性名
描述
UseMemoryMappedFile
设置或获取是否使用内存映射文件(MMF)
MapFileName
内存映射文件名(仅Win32平台有效)
IPDatabasePath
IP数据库文件位置
IPDatabaseVersion
IP数据库版本

示例

static void Main(string[] args)
{
	using (Component component = new Component())
	{
		component.IPDatabasePath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "IP2LOCATION.BIN");
		IPResult result = component.IPQuery("58.220.95.56");
		Console.WriteLine("AreaCode: " + result.AreaCode);
		Console.WriteLine("CountryCode: " + result.CountryCode);
		Console.WriteLine("Country: " + result.Country);
		Console.WriteLine("Region: " + result.Region);
		Console.WriteLine("City: " + result.City);
		Console.WriteLine("Latitude: " + result.Latitude);
		Console.WriteLine("Longitude: " + result.Longitude);
		...
	}
	Console.ReadKey();
}

验证字符串是否为有效的电子邮件格式

示例

该示例定义 IsValidEmail 方法,如果字符串包含有效的电子邮件地址,则该方法返回 true ,否则返回 false ,但不采取其他任何操作。

请注意, IsValidEmail 方法不执行身份验证来验证电子邮件地址。 它只确定其格式对于电子邮件地址是否有效。 此外, IsValidEmail 方法不对顶级域名是否是 IANA 根区域数据中列出的有效域名进行验证,这需执行查找操作。 相反,正则表达式仅验证由二到二十四个 ASCII 字符组成的顶级域名,该域名以字母数字开头并以字符结尾,且其余的字符是字母数字或连字符 (-)。

using System;
using System.Globalization;
using System.Text.RegularExpressions;

public class RegexUtil
{
    public static bool IsValidEmail(string email)
    {
        if (string.IsNullOrWhiteSpace(email))
            return false;

        try
        {
            // Normalize the domain
            email = Regex.Replace(email, @"(@)(.+)$", DomainMapper,
                                  RegexOptions.None, TimeSpan.FromMilliseconds(200));
        }
        catch (RegexMatchTimeoutException e)
        {
            return false;
        }
        catch (ArgumentException e)
        {
            return false;
        }

        try
        {
            return Regex.IsMatch(email,
                @"^(?("")("".+?(?<!\\)""@)|(([0-9a-z]((\.(?!\.))|[-!#\$%&'\*\+/=\?\^`\{\}\|~\w])*)(?<=[0-9a-z])@))" +
                @"(?(\[)(\[(\d{1,3}\.){3}\d{1,3}\])|(([0-9a-z][-0-9a-z]*[0-9a-z]*\.)+[a-z0-9][\-a-z0-9]{0,22}[a-z0-9]))$",
                RegexOptions.IgnoreCase, TimeSpan.FromMilliseconds(250));
        }
        catch (RegexMatchTimeoutException)
        {
            return false;
        }
    }
    static string DomainMapper(Match match)
    {
        // Use IdnMapping class to convert Unicode domain names.
        var idn = new IdnMapping();

        // Pull out and process domain name (throws ArgumentException on invalid)
        var domainName = idn.GetAscii(match.Groups[2].Value);

        return match.Groups[1].Value + domainName;
    }
}

试用Spire.Xls读取Execl文件或IO,导出到 DataTable。

public DataTable ReadExecl(string fileName)
{
	using (var workbook = new Spire.Xls.Workbook())
	{
		workbook.LoadFromFile(fileName);
		using (var sheet = workbook.Worksheets[0])
		{
			return sheet.ExportDataTable();
		}
	}
}

Ping 域名或者IP地址,判读是否能正常连接到目标服务器。建议执行循环3~5次,取平均值判断网络延时更准确。

实例:

public static void SimplePing ()
{
    Ping pingSender = new Ping ();
    PingReply reply = pingSender.Send ("www.24kplus.com");

    if (reply.Status == IPStatus.Success)
    {
        Console.WriteLine ("Address: {0}", reply.Address.ToString ());
        Console.WriteLine ("RoundTrip time: {0}", reply.RoundtripTime);
        Console.WriteLine ("Time to live: {0}", reply.Options.Ttl);
        Console.WriteLine ("Don't fragment: {0}", reply.Options.DontFragment);
        Console.WriteLine ("Buffer size: {0}", reply.Buffer.Length);
    }
    else
    {
        Console.WriteLine (reply.Status);
    }
}

该组件允许用户通过IP地址查询是否VPN代理、开放代理、Web代理、Tor出口、数据中心、Web主机(DCH)范围和搜索引擎机器人(SES),组件从 ip2proxy bin 数据文件中查询代理IP信息。

文件下载:

IP2Proxy 组件: https://down.24kplus.com/dev/ip2proxy-1.0.0.0.zip

免费 IP2Proxy BIN 数据: https://lite.ip2location.com

商业 IP2Proxy BIN 数据: https://www.ip2location.com/database/ip2proxy

要求

Microsoft .NET 4.0 framework 或更高 / Microsoft .NET Core 2.0 或更高.

方法

方法名
描述
Close
关闭并清理文件缓存
GetPackageVersion
获取软件包版本(PX1到PX8的1到8)
GetDatabaseVersion
获取数据库版本
ProxyQuery
代理信息查询

属性

属性名
描述
UseMemoryMappedFile
设置或获取是否使用内存映射文件(MMF)
MapFileName
内存映射文件名(仅Win32平台有效)
ProxyDatabasePath
代理数据库文件位置
IsProxy
检查IP地址是否是代理
  • -1:错误
  • 0:非代理
  • 1:代理
  • 2:数据中心IP地址或搜索引擎机器人
ProxyType
代理类型
  • VPN
  • TOR
  • DCH
  • PUB*
  • WEB
  • SES

示例

static void Main(string[] args)
{
	using (var component = new IP2Proxy.Component())
	{
		component.ProxyDatabasePath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "IP2PROXY-PX8.BIN");
		component.UseMemoryMappedFile = true;
		var proxy = component.ProxyQuery("58.220.95.56");

		Console.WriteLine("IsProxy: " + proxy.IsProxy.ToString());
		Console.WriteLine("ProxyType: " + proxy.ProxyType);
		Console.WriteLine("CountryCode: " + proxy.CountryCode);
		Console.WriteLine("Country: " + proxy.Country);
		Console.WriteLine("Region: " + proxy.Region);
		Console.WriteLine("City: " + proxy.City);
		Console.WriteLine("ISP: " + proxy.ISP);
		Console.WriteLine("Domain: " + proxy.Domain);
		Console.WriteLine("UsageType: " + proxy.UsageType);
		Console.WriteLine("ASN: " + proxy.ASN);
		Console.WriteLine("AS: " + proxy.AS);
		Console.WriteLine("LastSeen: " + proxy.LastSeen);
	}
	Console.ReadKey();
}