ZhiYeJianKang_PeiXun/cyqdata-master/DotNetCore/System/Web/HttpResponse.cs
2025-02-20 15:41:53 +08:00

307 lines
8.9 KiB
C#
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using System.IO;
using System.Threading.Tasks;
using System.Collections.Specialized;
using Microsoft.AspNetCore.Http;
using System.Text;
using CYQ.Data;
using static System.Net.Mime.MediaTypeNames;
namespace System.Web
{
/// <summary>
/// 输出对象(单例存在,不该有自己的属性)
/// </summary>
public class HttpResponse
{
Microsoft.AspNetCore.Http.HttpContext context
{
get
{
return HttpContext.contextAccessor.HttpContext;
}
}
Microsoft.AspNetCore.Http.HttpResponse response => context.Response;
internal HttpResponse()
{
}
#region Web
public void End()
{
if (!context.Items.ContainsKey("IsRunToEnd"))
{
context.Items.Add("IsRunToEnd", true);
}
}
private bool IsEnd
{
get
{
return context.Items.ContainsKey("IsRunToEnd");
}
}
public string Charset
{
get
{
string ct = ContentType;
int i = ct.IndexOf("charset=");
if (i > -1)
{
return ct.Substring(i + 8);
}
return "utf-8";
}
set
{
//Headers are read-only, response has already started
if (HasStarted) { return; }
string ct = ContentType;
if (string.IsNullOrEmpty(ct))
{
ContentType = "text/html; charset=" + value.Replace("charset=", "");
}
else if (!ct.Contains("charset="))
{
ContentType = ct.TrimEnd(';') + "; charset=" + value;
}
}
}
public string ContentType
{
get => response.ContentType ?? "";
set
{
try
{
if (response.ContentType != value)
{
if (value.Contains("charset") || string.IsNullOrEmpty(response.ContentType))
{
response.ContentType = value;
}
else
{
string[] items = response.ContentType.Split(';');
if (items.Length == 2)//包含两个,只改前面的,不改编码
{
response.ContentType = value + ";" + items[1];
}
else if (response.ContentType.Contains("charset"))//只有charset
{
response.ContentType = value + "; " + items[0].Trim();
}
else//只有text/html
{
response.ContentType = value + "; charset=utf-8";
}
}
}
}
catch (Exception err)
{
Log.Write(err, LogType.Error);
}
}
}
public Encoding ContentEncoding
{
get
{
return Encoding.GetEncoding(Charset);
}
set
{
Charset = value.WebName;
}
}
public Stream Filter
{
get => Body;
set
{
Body = value;
}
}
public void AppendHeader(string key, string value)
{
if (!response.HasStarted)
{
response.Headers.Remove(key);
response.Headers.Add(key, value);
}
}
//public bool Buffer { get; set; }
//public int Expires { get; set; }
//public DateTime ExpiresAbsolute { get; set; }
public string CacheControl
{
get => Headers["Cache-Control"];
set => AppendHeader("Cache-Control", value);
}
public void Clear() { response.Clear(); }
public void Flush() { response.Body.Flush(); }
#endregion
public HttpCookieCollection Cookies
{
get
{
if (context.Items.ContainsKey("ResponseCookies"))
{
return context.Items["ResponseCookies"] as HttpCookieCollection;
}
else
{
var cookies = new HttpCookieCollection(true);
context.Items.Add("ResponseCookies", cookies);
return cookies;
}
}
}
public int StatusCode
{
get => response.StatusCode; set
{
if (!response.HasStarted)
{
response.StatusCode = value;
}
}
}
public NameValueCollection Headers
{
get
{
NameValueCollection nvc = new NameValueCollection();
if (response.Headers != null && response.Headers.Keys.Count > 0)
{
foreach (string key in response.Headers.Keys)
{
nvc.Add(key, response.Headers[key].ToString());
}
}
return nvc;
}
}
public Stream Body
{
get => response.Body;
set
{
response.Body = value;
}
}
public long? ContentLength { get => response.ContentLength; set => response.ContentLength = value; }
/// <summary>
/// 是否已启用输出:(已输出到客户端 || 已调用Response.End() || 已调用Response.Write()
/// </summary>
public bool HasStarted
{
get
{
return response.HasStarted || IsEnd || context.Items.TryGetValue("CallWrite", out _);
}
}
public void OnCompleted(Func<object, Task> callback, object state)
{
response.OnCompleted(callback, state);
}
public void OnStarting(Func<object, Task> callback, object state)
{
response.OnStarting(callback, state);
}
/// <summary>
/// 302 跳转
/// </summary>
/// <param name="location"></param>
public void Redirect(string location)
{
Redirect(location, false);
}
/// <summary>
/// 跳转
/// </summary>
/// <param name="location"></param>
/// <param name="permanent">true 301跳转默认false 是302跳转</param>
public void Redirect(string location, bool permanent)
{
if (string.IsNullOrEmpty(location)) { return; }
if (!location.StartsWith("/") && !location.StartsWith("http://") && !location.StartsWith("https://"))
{
string path = context.Request.Path;// microservice/login
string[] items = path.Trim('/').Split('/');
items[items.Length - 1] = location;
location = "/" + string.Join("/", items);
}
response.Redirect(location, permanent);
End();
}
/// <summary>
/// 内部:异步执行的(未等待)
/// </summary>
/// <param name="text"></param>
public void Write(string text)
{
if (!IsEnd)
{
SetWriteFlag();
byte[] data = ContentEncoding.GetBytes(text);
response.Body.WriteAsync(data, 0, data.Length);
}
}
/// <summary>
/// 内部:异步执行的(并等待结束)
/// </summary>
/// <param name="fileName"></param>
public void WriteFile(string fileName)
{
byte[] data = File.ReadAllBytes(fileName);
if (!IsEnd && data != null)
{
SetWriteFlag();
response.Body.WriteAsync(data, 0, data.Length).Wait();
End();
}
}
/// <summary>
/// 内部:异步执行的(并等待结束)
/// </summary>
/// <param name="data"></param>
public void BinaryWrite(byte[] data)
{
if (!IsEnd && data != null)
{
SetWriteFlag();
response.Body.WriteAsync(data, 0, data.Length).Wait();
}
}
private void SetWriteFlag()
{
if (!context.Items.ContainsKey("CallWrite"))
{
context.Items.Add("CallWrite", true);
}
}
}
}