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(); }
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(); } }