Ejemplo n.º 1
0
		private RouteAction CreateRoute(RouteAttribute routeAttr, MethodInfo method, object service)
		{
			var methodParams = method.GetParameters();

			IQueryValidator argResolver = null;
			if (routeAttr.QueryValidatorType != null)
				argResolver = (IQueryValidator)m_resolver.Create(routeAttr.QueryValidatorType);

			return async (context, routeArgs) =>
			{
				var response = context.Response;
				var request = context.Request;

				response.Chunked = routeAttr.EnableChunking;
				routeAttr.ModifyHttpContext(context);

				object taskResult;

				try
				{
					var result = await GetResult(context, routeArgs, service, method, methodParams, argResolver);

					var routeError = result as RouteError;
					if (routeError != null)
						taskResult = routeAttr.HandleError(routeError);
					else
						taskResult = routeAttr.Transform(result);
				}
				catch (Exception ex)
				{
					if (ex is TargetInvocationException)
						ex = ex.InnerException;

					m_logger.Error(ex);
					response.Status = HttpStatusCode.InternalServerError;

					var message = m_debug ? ex.ToString() : "Internal server error";

					var error = new RouteError(RouteErrorDomain.Invocation, message);
					taskResult = routeAttr.HandleError(error);
				}

				if (taskResult != null)
				{
					var data = request.Encoding.GetBytes(taskResult.ToString() + "\r\n");

					if (!response.Chunked)
						response.ContentLength = data.Length;

					await response.Stream.WriteAsync(data, 0, data.Length);
				}
			};
		}