对Uri的一些扩展方法
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Web;
namespace ZmjTool
{
public static class HttpTool
{
/// <summary>
/// 根据ip获取主机的名称
/// </summary>
/// <param name="ipstr"></param>
/// <returns></returns>
public static string GetHostNameFromIp(this string ipstr)
{
System.Net.IPAddress ip = System.Net.IPAddress.Parse(ipstr);
System.Net.IPHostEntry host = System.Net.Dns.GetHostEntry(ip);
return host.HostName;
}
/// <summary>
/// 将指定的可能的相对url转化为绝对url
/// </summary>
/// <param name="url">一个相对的url或者其他以http开头的url</param>
/// <param name="srcurl">必须是请求时的url</param>
/// <returns></returns>
public static Uri TryGetAbsoluteUri(this string url, Uri srcurl)
{//检查是否是绝对url
try { return new Uri(srcurl, url); }
catch (Exception) { return null; }
}
/// <summary>
/// 替代HttpUtility.UrlEncode解决空格问题
/// </summary>
/// <param name="str"></param>
/// <returns></returns>
public static string UriEncode(this string str)
{
return HttpUtility.UrlEncode(str).Replace("+", "%20").Replace("%2b", "+");
}
/// <summary>
/// 根据uri获取他的一个可用的保存文件用的名称
/// </summary>
/// <param name="uri"></param>
/// <returns></returns>
public static string GetSafeUriNames(this Uri uri)
{
if (uri.Segments.LastOrDefault(x => !string.IsNullOrWhiteSpace(x.Trim('/'))) is string nm) return nm.Trim('/');
return uri.Host;
}
/// <summary>
/// 返回http://或者https://开头部分的http部分去除的后面部分
/// </summary>
/// <param name="url"></param>
/// <returns></returns>
public static string GetAbsoluteUriWithOutHttp(this string url)
{
return url.Substring(url.IndexOf("://") + 1);
}
/// <summary>
/// url资源的相等比较器
/// </summary>
public class StringUriEquasComp : IEqualityComparer<string>
{
public bool Equals(string x, string y)
{
return GetAbsoluteUrlWithOutHttp(x ?? "") == GetAbsoluteUrlWithOutHttp(y ?? "");
}
public int GetHashCode(string obj)
{
return GetAbsoluteUrlWithOutHttp(obj).GetHashCode();
}
}
/// <summary>
/// 词典中的key是url的情况下消除重复的
/// </summary>
public class DicStringUriEquasComp : IEqualityComparer<KeyValuePair<Uri, string>>
{
public bool Equals(KeyValuePair<Uri, string> x, KeyValuePair<Uri, string> y)
{
return GetAbsoluteUrlWithOutHttp(x.Key.AbsoluteUri) == GetAbsoluteUrlWithOutHttp(y.Key.AbsoluteUri);
}
public int GetHashCode(KeyValuePair<Uri, string> obj)
{
return GetAbsoluteUrlWithOutHttp(obj.Key.AbsoluteUri).GetHashCode();
}
}
/// <summary>
/// 消除相同的连接
/// </summary>
public class UriEquasComp : IEqualityComparer<Uri>
{
public bool Equals(Uri x, Uri y)
{
return GetAbsoluteUrlWithOutHttp(x?.AbsoluteUri ?? "") == GetAbsoluteUrlWithOutHttp(y?.AbsoluteUri ?? "");
}
public int GetHashCode(Uri obj)
{
return GetAbsoluteUrlWithOutHttp(obj.AbsoluteUri).GetHashCode();
}
}
}
}