使用 Asp.net core 开发网站时,不同于以往的Framework,Razor引擎并不能实时编译。因此需要手动添加运行时编译包:Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation。

解决步骤:

1、通过 NuGet 添加 Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation;

2、在 Startup.cs 类文件中添加该模块;

在 Startup.cs 文件中的 ConfigureServices 函数中追加 .AddRazorRuntimeCompilation();

public void ConfigureServices(IServiceCollection services)
{
   //追加 .AddRazorRuntimeCompilation();
   services.AddControllersWithViews().AddRazorRuntimeCompilation();
}

解决 XmlDocument 在调用 LoadXml 方法时发生 hexadecimal value 0x08, is an invalid character 和 hexadecimal value 0x12, is an invalid character 等错误。

原因是有很多符号不能在XML代码中出现,所以我们要替换掉:

private string ReplaceHexadecimalSymbols(string txt)
{
	if (txt != "")
	{
		string r = "[\x00-\x08\x0B\x0C\x0E-\x1F]";
		return Regex.Replace(txt, r, "", RegexOptions.Compiled);
	}
	else
	{
		return "";
	}
}

可以新建一个ActionFilterAttribute来实现:

public class JsonCallbackAttribute : ActionFilterAttribute
{
    private const string CallbackQueryParameter = "callback";

    public override void OnActionExecuted(HttpActionExecutedContext context)
    {
        var callback = string.Empty;

        if (IsJsonp(out callback))
        {
            var jsonBuilder = new StringBuilder(callback);

            jsonBuilder.AppendFormat("({0})", context.Response.Content.ReadAsStringAsync().Result);

            context.Response.Content = new StringContent(jsonBuilder.ToString());
        }

        base.OnActionExecuted(context);
    }

    private bool IsJsonp(out string callback)
    {
        callback = HttpContext.Current.Request.QueryString[CallbackQueryParameter];

        return !string.IsNullOrEmpty(callback);
    }
}

使用例子:

[JsonCallback]
public IEnumerable<User> User()
{
    return _user;
}

C# .NET Hallo world

要解决中文乱码问题,首先我们需要知道原因,一开始我尝试了gb2312,utf-8等多种编码格式导出,使用 Execl 打开均为乱码,后来无意中发现,必须为“带 BOM 的 UTF-8”。

代码示例:

using(var sw = new File.CreateText(fileName))
{
	sw .WriteLine(csvContent);
}

如果是asp.net页面输出,则为:

Response.Clear();
Response.Buffer = true;
Response.AppendHeader("Content-Disposition", "attachment;filename=" + DateTime.Now.ToShortDateString() + fileName + ".xls");
Response.ContentEncoding = System.Text.Encoding.UTF8;
Response.Charset = "utf-8";
Response.ContentType = "text/csv";
using(var outputWriter = new StreamWriter(Response.OutputStream, System.Text.Encoding.UTF8))
{
	outputWriter.WriteLine(csvContent);
}
Response.Flush();
Response.End();

要完成高性能的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();
}