Ejemplo n.º 1
0
        private static void ProduceResponse(HttpContext context, IRuntimeContextInstance runner)
        {
            int    methodIndex = runner.FindMethod("ОбработкаВызоваHTTPСервиса");
            IValue result;

            IValue[] args = new IValue[1];
            args[0] = new ScriptEngine.HostedScript.Library.HTTPService.HTTPServiceRequestImpl(context);
            runner.CallAsFunction(methodIndex, args, out result);

            // Обрабатываем результаты
            var response = (ScriptEngine.HostedScript.Library.HTTPService.HTTPServiceResponseImpl)result;

            context.Response.StatusCode = response.StatusCode;

            if (response.Headers != null)
            {
                foreach (var ch in response.Headers)
                {
                    context.Response.AddHeader(ch.Key.AsString(), ch.Value.AsString());
                }
            }

            if (response.Reason != "")
            {
                context.Response.Status = response.Reason;
            }

            if (response.BodyStream != null)
            {
                response.BodyStream.Seek(0, SeekOrigin.Begin);
                response.BodyStream.CopyTo(context.Response.OutputStream);
            }

            context.Response.Charset = response.ContentCharset;
            context.Response.End();
        }
Ejemplo n.º 2
0
        public void ProcessRequest(HttpContext context)
        {
            #region Загружаем скрипт (файл .os)
            // Кэшируем исходный файл, если файл изменился (изменили скрипт .os) загружаем заново
            // Как это сделать с откомпилированным кодом, чтобы не компилировать?
            // В Linux под Mono не работает подписка на изменение файла.
            string      sourceCode = null;
            ObjectCache cache      = MemoryCache.Default;

            if (_cachingEnabled)
            {
                sourceCode = cache[context.Request.PhysicalPath] as string;
            }

            if (sourceCode == null)
            {
                CacheItemPolicy policy = new CacheItemPolicy();

                List <string> filePaths = new List <string>();
                filePaths.Add(context.Request.PhysicalPath);
                policy.ChangeMonitors.Add(new HostFileChangeMonitor(filePaths));

                // Загружаем файл и помещаем его в кэш
                sourceCode = File.ReadAllText(context.Request.PhysicalPath);
                cache.Set(context.Request.PhysicalPath, sourceCode, policy);
            }
            #endregion

            var runner = _hostedScript.EngineInstance.AttachedScriptsFactory.LoadFromString(
                _hostedScript.EngineInstance.GetCompilerService(), sourceCode);

            int exitCode = 0;

            try
            {
                int      methodIndex = runner.FindMethod("ОбработкаВызоваHTTPСервиса");
                IValue   result;
                IValue[] args = new IValue[1];
                args[0] = new ScriptEngine.HostedScript.Library.HTTPService.HTTPServiceRequestImpl(context);

                runner.CallAsFunction(methodIndex, args, out result);

                // Обрабатываем результаты
                ScriptEngine.HostedScript.Library.HTTPService.HTTPServiceResponseImpl response = (ScriptEngine.HostedScript.Library.HTTPService.HTTPServiceResponseImpl)result;
                context.Response.StatusCode = response.StatusCode;

                if (response.Headers != null)
                {
                    foreach (ScriptEngine.HostedScript.Library.KeyAndValueImpl ch in response.Headers)
                    {
                        context.Response.AddHeader(ch.Key.AsString(), ch.Value.AsString());
                    }
                }

                if (response.Reason != "")
                {
                    context.Response.Status = response.Reason;
                }

                if (response.BodyStream != null)
                {
                    response.BodyStream.Seek(0, SeekOrigin.Begin);
                    response.BodyStream.CopyTo(context.Response.OutputStream);
                }

                context.Response.Charset = response.ContentCharset;
            }
            catch (ScriptInterruptionException e)
            {
                exitCode = e.ExitCode;
                context.Response.StatusCode        = 500;
                context.Response.Status            = "Script running error";
                context.Response.SubStatusCode     = exitCode;
                context.Response.StatusDescription = e.Message;
            }
            catch (Exception e)
            {
                context.Response.StatusCode = 500;
                context.Response.Status     = e.Message;
            }
            finally
            {
                context.Response.End();
            }
        }