/// <summary> /// 获得文件返回 /// </summary> /// <param name="url"></param> /// <param name="IfModifiedSince"></param> /// <returns></returns> protected virtual async Task <IFullHttpResponse> GetFileResponseAsync(string url, ICharSequence IfModifiedSince) { if (url.StartsWith("/") || url.StartsWith(@"\")) { url = url.Substring(1); } string filePath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory ?? throw new DotNettyException("路径为空"), HtmlPageFolderPath, url); string extension = Path.GetExtension(filePath); if (string.IsNullOrEmpty(extension)) { return(HttpResponseHelper.GetHttpResponse(HttpResponseStatus.NotFound)); } if (!File.Exists(filePath)) { return(HttpResponseHelper.GetHttpResponse(HttpResponseStatus.NotFound)); } (FileCacheModel fileCacheModel, bool isCache) = await GetFileBytesAsync(filePath, IfModifiedSince); string contentType = MIMEManager.GetContentType(extension); Dictionary <AsciiString, object> headers = HttpResponseHelper.GetDefaultHeaders(contentType); headers.Add(HttpHeaderNames.LastModified, fileCacheModel.CacheTime); if (isCache) { return(HttpResponseHelper.GetHttpResponse(HttpResponseStatus.NotModified, headers)); } headers.Add(HttpHeaderNames.Expires, DateTime.Now.AddSeconds(CacheSecond)); headers.Add(HttpHeaderNames.CacheControl, $"max-age={CacheSecond}"); return(HttpResponseHelper.GetHttpResponse(HttpResponseStatus.OK, fileCacheModel.Body, headers)); }
/// <summary> /// 获取文本返回 /// </summary> /// <param name="actionResult"></param> /// <returns></returns> protected virtual IFullHttpResponse GetTextResponse(object actionResult) { Dictionary <AsciiString, object> headers = HttpResponseHelper.GetDefaultHeaders("text/plain;charset=utf-8"); IFullHttpResponse result = HttpResponseHelper.GetHttpResponse(HttpResponseStatus.OK, actionResult.ToString(), headers); return(result); }
/// <summary> /// 获取Json返回 /// </summary> /// <param name="actionResult"></param> /// <returns></returns> protected virtual IFullHttpResponse GetJsonResponse(object actionResult) { Dictionary <AsciiString, object> headers = HttpResponseHelper.GetDefaultHeaders("application/json;charset=utf-8"); IFullHttpResponse result = HttpResponseHelper.GetHttpResponse(HttpResponseStatus.OK, actionResult.ToJson(), headers); return(result); }
/// <summary> /// 获得Options返回 /// </summary> /// <param name="methodName"></param> /// <returns></returns> protected virtual IFullHttpResponse GetOptionsResponse(string methodName) { Dictionary <AsciiString, object> headers = HttpResponseHelper.GetDefaultHeaders(); headers.Add(HttpHeaderNames.AccessControlAllowHeaders, "authorization,access-control-allow-origin,content-type"); headers.Add(HttpHeaderNames.AccessControlAllowMethods, $"{methodName.ToUpper()}"); IFullHttpResponse response = HttpResponseHelper.GetHttpResponse(HttpResponseStatus.OK, headers); return(response); }
/// <summary> /// 获取流返回 /// </summary> /// <param name="stream"></param> /// <returns></returns> protected virtual async Task <IFullHttpResponse> GetStreamResponseAsync(Stream stream) { var bytes = new byte[stream.Length]; await stream.ReadAsync(bytes, 0, bytes.Length); stream.Close(); stream.Dispose(); Dictionary <AsciiString, object> headers = HttpResponseHelper.GetDefaultHeaders("application/octet-stream"); IFullHttpResponse result = HttpResponseHelper.GetHttpResponse(HttpResponseStatus.OK, bytes, headers); return(result); }
public override async Task HandlerAsync(IChannelHandlerContext ctx, IByteBufferHolder byteBufferHolder) { try { await HandlerAsync <IFullHttpRequest>(ctx, byteBufferHolder, HandlerRequestAsync); } catch (Exception exception) { OnException?.Invoke(exception); Dictionary <AsciiString, object> headers = HttpResponseHelper.GetDefaultHeaders("text/plain;charset=utf-8"); IFullHttpResponse response = HttpResponseHelper.GetHttpResponse(HttpResponseStatus.InternalServerError, exception.Message, headers); await SendHttpResponseAsync(ctx, byteBufferHolder, response); } }
/// <summary> /// 处理异常 /// </summary> /// <param name="ctx"></param> /// <param name="byteBufferHolder"></param> /// <param name="exception"></param> /// <returns></returns> protected virtual async Task HandlerExceptionAsync(IChannelHandlerContext ctx, IByteBufferHolder byteBufferHolder, Exception exception) { Dictionary <AsciiString, object> headers = HttpResponseHelper.GetDefaultHeaders("text/plain;charset=utf-8"); IFullHttpResponse response = HttpResponseHelper.GetHttpResponse(HttpResponseStatus.InternalServerError, exception.Message, headers); IFilter[] globalFilters = _controllerBus.GetGlobalFilters(); List <IExceptionFilter> exceptionFilters = globalFilters.OfType <IExceptionFilter>().ToList(); List <IExceptionAsyncFilter> exceptionAsyncFilters = globalFilters.OfType <IExceptionAsyncFilter>().ToList(); if (exceptionFilters.Count > 0 || exceptionAsyncFilters.Count > 0) { foreach (IExceptionFilter exceptionFilter in exceptionFilters) { response = exceptionFilter.HandlerException(byteBufferHolder, exception); } foreach (IExceptionAsyncFilter exceptionFilter in exceptionAsyncFilters) { response = await exceptionFilter.HandlerExceptionAsync(byteBufferHolder, exception); } } await SendHttpResponseAsync(ctx, byteBufferHolder, response); StopHandler(); }