C#个人常用标准库 > HttpTool


对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();
            }
        }
    }
}