/// <summary> /// Api行为上下文 /// </summary> /// <param name="requestContext">请求上下文</param> /// <param name="action">Api行为</param> /// <param name="context">上下文</param> public ActionContext(RequestContext requestContext, HttpAction action, IContenxt context) : base(requestContext.Request, requestContext.Response) { this.Action = action; this.Session = context.Session; this.AllSessions = context.AllSessions; }
/// <summary> /// 输出文件 /// </summary> /// <param name="context">上下文</param> private void ExecuteFileResult(RequestContext context) { if (string.IsNullOrEmpty(this.ContentType)) { this.ContentType = "application/ocelet-stream"; } context.Response.Charset = null; context.Response.ContentType = this.ContentType; context.Response.ContentDisposition = this.ContentDisposition; using (var stream = new FileStream(this.FileName, FileMode.Open, FileAccess.Read)) { const int size = 8 * 1024; var state = context.Response.WriteHeader((int)stream.Length); while (state == true) { var bytes = new byte[size]; var length = stream.Read(bytes, 0, size); if (length == 0) { break; } var content = new ByteRange(bytes, 0, length); state = context.Response.WriteContent(content); } } }
/// <summary> /// 执行结果 /// </summary> /// <param name="context">上下文</param> public override void ExecuteResult(RequestContext context) { if (File.Exists(this.FileName) == true) { this.ExecuteFileResult(context); } else { var result = new ErrorResult { Status = 404, Errors = "找不到文件:" + this.FileName }; result.ExecuteResult(context); } }
/// <summary> /// 执行结果 /// </summary> /// <param name="context">上下文</param> public override void ExecuteResult(RequestContext context) { context.Response.ContentType = "text/event-stream"; context.Response.WriteHeader(); var session =((IWrapper) context.Response).UnWrap(); var wapper = new HttpEventSession(session); session.SetProtocolWrapper("sse", wapper); if (this.httpEvent != null) { wapper.SendEvent(this.httpEvent); } }
/// <summary> /// 收到http请求 /// </summary> /// <param name="context">上下文</param> /// <returns></returns> private Task OnHttpRequest(IContenxt context) { try { var request = default(HttpRequest); if (HttpRequest.Parse(context, out request) == false) { return this.Next.Invoke(context); } if (context.Session.Protocol == null) { context.Session.SetProtocolWrapper("http", null); } if (request == null) { return new Task(() => { }); } if (request.IsWebsocketRequest() == true) { const string secKey = "Sec-WebSocket-Key"; context.Session.Tag.Set(secKey, request.Headers[secKey]); return this.Next.Invoke(context); } return new Task(() => { var response = new HttpResponse(context.Session); var requestContext = new RequestContext(request, response); this.OnHttpRequest(context, requestContext); }); } catch (HttpException ex) { return new Task(() => this.OnException(context.Session, ex)); } catch (Exception ex) { return new Task(() => this.OnException(context.Session, new HttpException(500, ex.Message))); } }
/// <summary> /// 收到http请求 /// </summary> /// <param name="context">上下文</param> /// <param name="requestContext">请求上下文</param> protected override void OnHttpRequest(IContenxt context, NetworkSocket.Http.RequestContext requestContext) { var request = requestContext.Request; var response = requestContext.Response; if (AppConfig.PathPattern.IsMatch(request.Path) == false) { var message = "路径不匹配,数据未转发 .."; response.Write(message); Console.WriteLine(message); } else { var fastSessions = context.AllSessions.FilterWrappers <FastSession>().ToArray(); foreach (var session in fastSessions) { this.PushRequest(session, request); } var message = string.Format("数据已转发到{0}到客户端 ..", fastSessions.Length); response.Write(message); Console.WriteLine(message); } }
/// <summary> /// 执行结果 /// </summary> /// <param name="context">上下文</param> public override void ExecuteResult(RequestContext context) { var json = new DefaultDynamicJsonSerializer().Serialize(this.data); context.Response.ContentType = "application/json"; context.Response.Write(json); }
/// <summary> /// 执行结果 /// </summary> /// <param name="context">上下文</param> public override void ExecuteResult(RequestContext context) { var json = new JavaScriptSerializer().Serialize(data); context.Response.ContentType = "application/json"; context.Response.Write(json); }
/// <summary> /// 异常上下文 /// </summary> /// <param name="requestContext">请求上下文</param> /// <param name="exception">异常</param> public ExceptionContext(RequestContext requestContext, Exception exception) : base(requestContext.Request, requestContext.Response) { this.Exception = exception; }
/// <summary> /// 处理一般的请求 /// </summary> /// <param name="route">路由</param> /// <param name="requestContext">上下文</param> private void ProcessNormalRequest(string route, RequestContext requestContext) { var action = this.httpActionList.TryGet(requestContext.Request); if (action == null) { this.ProcessActionNotFound(route, requestContext); } else { this.ExecuteHttpAction(action, requestContext); } }
/// <summary> /// 异常时 /// </summary> /// <param name="session">产生异常的会话</param> /// <param name="exception">异常</param> protected sealed override void OnException(ISession session, Exception exception) { var response = new HttpResponse(session); var requestContext = new RequestContext(null, response); var exceptionConext = new ExceptionContext(requestContext, exception); this.ExecGlobalExceptionFilters(exceptionConext); if (exceptionConext.Result != null) { exceptionConext.Result.ExecuteResult(requestContext); } else { base.OnException(session, exception); } }
/// <summary> /// 执行结果 /// </summary> /// <param name="context">上下文</param> public abstract void ExecuteResult(RequestContext context);
/// <summary> /// 执行结果 /// </summary> /// <param name="context">上下文</param> public override void ExecuteResult(RequestContext context) { var gzip = context.Request.IsAcceptGZip(); context.Response.WriteResponse(Content, gzip); }
/// <summary> /// 处理一般的请求 /// </summary> /// <param name="route">路由</param> /// <param name="context">上下文</param> /// <param name="requestContext">请求上下文</param> private void ProcessActionRequest(string route, IContenxt context, RequestContext requestContext) { var action = this.httpActionList.TryGet(requestContext.Request); if (action == null) { var ex = new HttpException(404, "找不到路径" + route); this.ProcessHttpException(ex, requestContext); } else { this.ExecuteHttpAction(action, context, requestContext); } }
/// <summary> /// 处理http请求 /// </summary> /// <param name="requestContext">请求上下文</param> private void ProcessRequest(RequestContext requestContext) { var route = requestContext.Request.Url.AbsolutePath; var action = this.httpActionList.TryGet(requestContext.Request); if (action == null) { var exception = new ApiNotExistException(route); var exceptionContext = new ExceptionContext(requestContext, exception); foreach (var filter in this.GlobalFilter.ExceptionFilters) { filter.OnException(exceptionContext); if (exceptionContext.ExceptionHandled == true) break; } var result = exceptionContext.Result != null ? exceptionContext.Result : new ErrorResult { Status = 404, Errors = exception.Message }; result.ExecuteResult(requestContext); } else { var controller = this.DependencyResolver.GetService(action.DeclaringService) as HttpController; var actionContext = new ActionContext(requestContext, action); controller.Server = this; ((IHttpController)controller).Execute(actionContext); // 释放资源 this.DependencyResolver.TerminateService(controller); } }
/// <summary> /// Api行为上下文 /// </summary> /// <param name="context">请求上下文</param> /// <param name="action">Api行为</param> public ActionContext(RequestContext context, HttpAction action) : base(context.Request, context.Response) { this.Action = action; }
/// <summary> /// 执行结果 /// </summary> /// <param name="context">上下文</param> public override void ExecuteResult(RequestContext context) { this.ExecuteResult(context.Response); }
/// <summary> /// 处理静态资源请求 /// </summary> /// <param name="extension">扩展名</param> /// <param name="requestContext">上下文</param> private void ProcessStaticFileRequest(string extension, RequestContext requestContext) { var contenType = this.MIMECollection.GetContentType(extension); var file = requestContext.Request.Url.AbsolutePath.TrimStart('/').Replace(@"/", @"\"); if (string.IsNullOrWhiteSpace(contenType) == true) { var result = new ErrorResult { Status = 403 }; result.ExecuteResult(requestContext); } else if (File.Exists(file) == false) { var result = new ErrorResult { Status = 404, Errors = "找不到指定的文件 .." }; result.ExecuteResult(requestContext); } else { var result = new FileResult { FileName = file, ContentType = contenType }; result.ExecuteResult(requestContext); } }
/// <summary> /// 处理http请求 /// </summary> /// <param name="requestContext">请求上下文</param> private void ProcessRequest(RequestContext requestContext) { var extenstion = Path.GetExtension(requestContext.Request.Path); if (string.IsNullOrWhiteSpace(extenstion) == false) { this.ProcessStaticFileRequest(extenstion, requestContext); } else { this.ProcessNormalRequest(requestContext.Request.Path, requestContext); } }
/// <summary> /// 收到Http请求时触发 /// </summary> /// <param name="context">上下文</param> /// <param name="requestContext">请求上下文对象</param> protected override void OnHttpRequest(IContenxt context, RequestContext requestContext) { var extenstion = Path.GetExtension(requestContext.Request.Path); if (string.IsNullOrWhiteSpace(extenstion) == false) { this.ProcessStaticFileRequest(extenstion, requestContext); } else { this.ProcessActionRequest(requestContext.Request.Path, context, requestContext); } }
/// <summary> /// 处理静态资源请求 /// </summary> /// <param name="extension">扩展名</param> /// <param name="requestContext">上下文</param> private void ProcessStaticFileRequest(string extension, RequestContext requestContext) { var contenType = this.MIMECollection[extension]; var file = requestContext.Request.Url.AbsolutePath.TrimStart('/').Replace(@"/", @"\"); if (string.IsNullOrWhiteSpace(contenType) == true) { var ex = new HttpException(403, string.Format("未配置{0}格式的MIME ..", extension)); this.ProcessHttpException(ex, requestContext); } else if (File.Exists(file) == false) { var ex = new HttpException(404, string.Format("找不到文件{0} ..", file)); this.ProcessHttpException(ex, requestContext); } else { var result = new FileResult { FileName = file, ContentType = contenType }; result.ExecuteResult(requestContext); } }
/// <summary> /// 收到Http请求时触发 /// </summary> /// <param name="context">上下文</param> /// <param name="requestContext">请求上下文对象</param> /// <returns ></returns> protected abstract Task OnHttpRequestAsync(IContenxt context, RequestContext requestContext);
/// <summary> /// 执行httpAction /// </summary> /// <param name="action">httpAction</param> /// <param name="context">上下文</param> /// <param name="requestContext">请求上下文</param> private void ExecuteHttpAction(HttpAction action, IContenxt context, RequestContext requestContext) { var actionContext = new ActionContext(requestContext, action, context); var controller = GetHttpController(actionContext); if (controller != null) { controller.Execute(actionContext); this.DependencyResolver.TerminateService(controller); } }
/// <summary> /// 收到Http请求时触发 /// </summary> /// <param name="context">上下文</param> /// <param name="requestContext">请求上下文对象</param> protected abstract void OnHttpRequest(IContenxt context, RequestContext requestContext);
/// <summary> /// 处理Http异常 /// </summary> /// <param name="ex">Http异常</param> /// <param name="context">请求上下文</param> private void ProcessHttpException(HttpException ex, RequestContext context) { var exceptionContent = new ExceptionContext(context, ex); this.ExecGlobalExceptionFilters(exceptionContent); var result = exceptionContent.Result ?? new ErrorResult(ex); result.ExecuteResult(context); }
/// <summary> /// 执行httpAction /// </summary> /// <param name="action">httpAction</param> /// <param name="requestContext">上下文</param> private void ExecuteHttpAction(HttpAction action, RequestContext requestContext) { var controller = this.DependencyResolver.GetService(action.DeclaringService) as HttpController; var actionContext = new ActionContext(requestContext, action); controller.Server = this; ((IHttpController)controller).Execute(actionContext); // 释放资源 this.DependencyResolver.TerminateService(controller); }
/// <summary> /// 收到Http请求 /// </summary> /// <param name="request">请求对象</param> /// <param name="response">回复对象</param> protected override void OnHttpRequest(HttpRequest request, HttpResponse response) { var route = request.Url.AbsolutePath; var action = this.httpActionList.TryGet(route); var requestContext = new RequestContext(request, response); if (action == null) { var exception = new ApiNotExistException(route); var exceptionContext = new ExceptionContext(requestContext, exception); foreach (var filter in this.GlobalFilter.ExceptionFilters) { filter.OnException(exceptionContext); if (exceptionContext.ExceptionHandled == true) break; } var result = exceptionContext.Result == null ? new ErrorResult { Status = 404, Errors = exception.Message } : exceptionContext.Result; result.ExecuteResult(requestContext); } else { var controller = this.DependencyResolver.GetService(action.DeclaringService) as HttpController; var actionContext = new ActionContext(requestContext, action); controller.Server = this; ((IHttpController)controller).Execute(actionContext); } }
/// <summary> /// 执行结果 /// </summary> /// <param name="context">上下文</param> public override void ExecuteResult(RequestContext context) { context.Response.Write(content); }
/// <summary> /// 执行结果 /// </summary> /// <param name="context">上下文</param> public override void ExecuteResult(RequestContext context) { context.Response.Status = this.Status; context.Response.Write(this.Errors); }
/// <summary> /// 处理找不到Action /// </summary> /// <param name="route">路由</param> /// <param name="requestContext">上下文</param> private void ProcessActionNotFound(string route, RequestContext requestContext) { var exception = new ApiNotExistException(route); var exceptionContext = new ExceptionContext(requestContext, exception); foreach (var filter in this.GlobalFilter.ExceptionFilters) { filter.OnException(exceptionContext); if (exceptionContext.ExceptionHandled == true) break; } var result = exceptionContext.Result != null ? exceptionContext.Result : new ErrorResult { Status = 404, Errors = exception.Message }; result.ExecuteResult(requestContext); }