using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Threading;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc.Controllers;
using Microsoft.Extensions.Primitives;
namespace TEAMModelOS.SDK.Extension
{
public static class HttpContextExtensions
{
///
/// 取得驗證金鑰,Authorization
///
public static string GetToken(this HttpContext httpContext)
{
return httpContext.Request.Headers["Authorization"].ToString();
}
///
/// 获取 Action 特性
///
///
///
///
public static TAttribute GetMetadata(this HttpContext httpContext)
where TAttribute : class
{
return httpContext.GetEndpoint()?.Metadata?.GetMetadata();
}
///
/// 获取 控制器/Action 描述器
///
///
///
public static ControllerActionDescriptor GetControllerActionDescriptor(this HttpContext httpContext)
{
return httpContext.GetEndpoint()?.Metadata?.FirstOrDefault(u => u is ControllerActionDescriptor) as ControllerActionDescriptor;
}
///
/// 获取本机 IPv4地址
///
///
///
public static string GetLocalIpAddressToIPv4(this HttpContext context)
{
return context.Connection.LocalIpAddress?.MapToIPv4()?.ToString();
}
///
/// 获取本机 IPv6地址
///
///
///
public static string GetLocalIpAddressToIPv6(this HttpContext context)
{
return context.Connection.LocalIpAddress?.MapToIPv6()?.ToString();
}
///
/// 获取远程 IPv4地址
///
///
///
public static string GetRemoteIpAddressToIPv4(this HttpContext context)
{
return context.Connection.RemoteIpAddress?.MapToIPv4()?.ToString();
}
///
/// 获取远程 IPv6地址
///
///
///
public static string GetRemoteIpAddressToIPv6(this HttpContext context)
{
return context.Connection.RemoteIpAddress?.MapToIPv6()?.ToString();
}
///
/// 获取完整请求地址
///
///
///
public static string GetRequestUrlAddress(this HttpRequest request)
{
return new StringBuilder()
.Append(request.Scheme)
.Append("://")
.Append(request.Host)
.Append(request.PathBase)
.Append(request.Path)
.Append(request.QueryString)
.ToString();
}
///
/// 获取来源地址
///
///
///
///
public static string GetRefererUrlAddress(this HttpRequest request, string refererHeaderKey = "Referer")
{
return request.Headers[refererHeaderKey].ToString();
}
///
/// 读取 Body 内容
///
///
/// 需先在 Startup 的 Configure 中注册 app.EnableBuffering()
///
public static async Task ReadBodyContentAsync(this HttpContext httpContext)
{
if (httpContext == null) return default;
return await httpContext.Request.ReadBodyContentAsync();
}
///
/// 读取 Body 内容
///
///
/// 需先在 Startup 的 Configure 中注册 app.EnableBuffering()
///
public static async Task ReadBodyContentAsync(this HttpRequest request)
{
request.Body.Seek(0, SeekOrigin.Begin);
using var reader = new StreamReader(request.Body, Encoding.UTF8, true, 1024, true);
var body = await reader.ReadToEndAsync();
// 回到顶部,解决此类问题 https://gitee.com/dotnetchina/Furion/issues/I6NX9E
request.Body.Seek(0, SeekOrigin.Begin);
return body;
}
///
/// 判断是否是 WebSocket 请求
///
///
///
public static bool IsWebSocketRequest(this HttpContext context)
{
return context.WebSockets.IsWebSocketRequest || context.Request.Path == "/ws";
}
///
/// 设置响应头 Tokens
///
///
///
///
public static void SetTokensOfResponseHeaders(this HttpContext httpContext, string accessToken, string refreshToken = null)
{
httpContext.Response.Headers["access-token"] = accessToken;
if (!string.IsNullOrWhiteSpace(refreshToken))
{
httpContext.Response.Headers["x-access-token"] = refreshToken;
}
}
///
/// 取得JWT驗證金鑰,Authorization Bearer
///
///
///
public static string GetJwtToken(this HttpContext httpContext)
{
var token = string.Empty;
string authorization = httpContext.Request.Headers["Authorization"].ToString();
if (!string.IsNullOrWhiteSpace(authorization) && authorization.StartsWith("Bearer ", StringComparison.OrdinalIgnoreCase))
{
token = authorization.Substring("Bearer ".Length).Trim();
}
return token;
}
///
/// 取得遠端呼叫的IP
///
public static string GetRemoteIP(this HttpContext httpContext)
{
return httpContext?.Connection?.RemoteIpAddress?.ToString();
}
///
/// 取得X-Auth-Key值
///
/// Key Name
///
public static string GetXAuth(this HttpContext httpContext, string key = null)
{
try
{
if (httpContext.Request.Headers.TryGetValue($"X-Auth-{key}", out StringValues value))
return value.ToString();
else
return null;
}
catch
{
return null;
}
}
///
/// 取得X-Auth-Key值
///
/// Key Name
///
public static string GetAuthorization(this HttpContext httpContext)
{
try
{
if (httpContext.Request.Headers.TryGetValue("Authorization", out StringValues value))
return value.ToString();
else
return null;
}
catch
{
return null;
}
}
///
/// 取得AuthToken權杖資訊
///
/// Key Name
///
public static (string id, string school) GetApiTokenInfo(this HttpContext httpContext, string key = null)
{
object id = null, school = null;
httpContext?.Items.TryGetValue("ID", out id);
httpContext?.Items.TryGetValue("School", out school);
return (id?.ToString(), school?.ToString());
}
///
/// 取得AuthToken權杖資訊
///
/// Key Name
///
public static (string id, string name, string picture, string school) GetAuthTokenInfo(this HttpContext httpContext, string key = null)
{
object id = null, name = null, picture = null, school = null;
httpContext?.Items.TryGetValue("ID", out id);
httpContext?.Items.TryGetValue("Name", out name);
httpContext?.Items.TryGetValue("Picture", out picture);
httpContext?.Items.TryGetValue("School", out school);
return (id?.ToString(), name?.ToString(), picture?.ToString(), school?.ToString());
}
///
/// 取得AuthToken權杖資訊
///
/// Key Name
///
public static (string id, string name, string picture, string school, string area, string keyData) GetAuthTokenKey(this HttpContext httpContext, string key = null)
{
object id = null, name = null, picture = null, school = null, area = null, keyData = null;
httpContext?.Items.TryGetValue("ID", out id);
httpContext?.Items.TryGetValue("Name", out name);
httpContext?.Items.TryGetValue("Picture", out picture);
httpContext?.Items.TryGetValue("School", out school);
httpContext?.Items.TryGetValue("Area", out area);
if (!string.IsNullOrWhiteSpace(key))
{
httpContext?.Items.TryGetValue(key, out keyData);
}
return (id?.ToString(), name?.ToString(), picture?.ToString(), school?.ToString(), area?.ToString(), keyData?.ToString());
}
///
/// 取得User-Agent值
///
public static string GetUserAgent(this HttpContext httpContext)
{
try
{
return httpContext.Request.Headers["User-Agent"].ToString();
}
catch
{
return null;
}
}
///
/// 取得Scheme值
///
public static string GetScheme(this HttpContext httpContext)
{
return httpContext?.Request?.Scheme;
}
///
/// 取得HostName值
///
public static string GetHostName(this HttpContext httpContext)
{
return httpContext?.Request?.Host.ToString();
}
///
/// 设置本地cookie
///
/// 键
/// 值
/// 过期时长,单位:分钟
public static void SetCookies(HttpResponse Response, string key, string value, int minutes = 30)
{
Response.Cookies.Append(key, value, new CookieOptions
{
Expires = DateTimeOffset.Now.AddMinutes(minutes)
});
}
///
/// 删除指定的cookie
///
/// 键
public static void DeleteCookies(HttpContext httpContext, string key)
{
httpContext.Response.Cookies.Delete(key);
}
}
}