public override async Task OnResultExecutionAsync(ResultExecutingContext context, ResultExecutionDelegate next) { var view = context.Result as ViewResult; if (view != null) { if (!string.IsNullOrEmpty(view.ViewName) && !view.ViewName.EndsWith(".cshtml")) { IActionResult result; if ((context.Controller as Controller)?.ViewBag == null) { result = await APPCommon.View(view.ViewName, model : view.Model); } else { var viewbag = (context.Controller as Controller)?.ViewBag as DynamicObject; var allnames = viewbag.GetDynamicMemberNames(); //var vieweeebag = viewbag.ToDictionary(row => (string)row., // row => row.Value); var ee = new ExpandoObject(); IDictionary <string, object> eeee = (IDictionary <string, object>)ee; foreach (var key in allnames) { eeee.Add(key, GetDynamicMember(viewbag, key)); } result = await APPCommon.View(view.ViewName, model : view.Model, viewBag : ee); } context.Result = result; } } await next(); }
public async Task <int> UpdateCache() { APP.Dlls.Clear(); APP.Types.Clear(); APP.MethodInfos.Clear(); APP.RuntimeCodes.Clear(); APP.Composeentitys.Clear(); APP.DynamicReferenceDlls.Clear(); APP.AConFlowSteps.Clear(); APP.ComposeTemplates.Clear(); APP.ClearCache(); //var razorlist = m_codeService.GetSimpleCode<SystemHtml>(null); //foreach(var ss in razorlist) //{ // if(APP.Razorengine.Handler.Cache.Contains(ss.Name)) // { // APP.Razorengine.Handler.Cache.Remove(ss.Name); // } //} await WebSetup.ClearAllDynamicActions(_actionProvider, _dynamicChangeTokenProvider); await WebSetup.BuildAllDynamicActions(_actionProvider, _dynamicChangeTokenProvider); APPCommon.InitRazorEngine(); return(0); }
private static async Task <string> HandleRazorKey(RuntimeStepModel newrunmodel, AConFlowStep s) { dynamic modelArg = null; var module = APPCommon.ModuleManager.GetModule(null, s.ModuleName); if (module == null) { modelArg = new { Step = s, Module = new { }, Item = newrunmodel.Res, Funs = newrunmodel.Funtions }; } else { modelArg = new { Step = s, Module = module.AsDynamic(), Item = newrunmodel.Res, Funs = newrunmodel.Funtions }; } return(await APPCommon.RenderRazorKey(s.ProxyCode, modelArg)); }
public IActionResult UploadFile(string dirName) { var remsg = string.Empty; dirName = dirName.UrlDecode(); if (Request.Form.Files.Count == 0) { remsg = ("未检测到文件"); return(new JsonResult(new { isok = false, msg = remsg })); } var result = APPCommon.UploadFile(Request, dirName); //dirName = dirName.ToServerFullPathEnEnsure(); //foreach (var file in Request.Form.Files) //{ // file.UploadSaveSingleFile(dirName); //} return(new JsonResult(new { isok = true, msg = remsg })); }
public static AConMvcCompileClass ToCompileClass(AConMvcClass systemHtml) { var newclass = new AConMvcCompileClass() { Guid = systemHtml.Guid, ActionCode = systemHtml.ActionCode, Addtime = systemHtml.Addtime, ClassAttrs = systemHtml.ClassAttrs, ClassName = systemHtml.ClassName, ExReferenceName = systemHtml.ExReferenceName, IsEanable = systemHtml.IsEanable, Name = systemHtml.Name, Id = systemHtml.Id, UrlRule = systemHtml.UrlRule, UsingNameSpance = systemHtml.UsingNameSpance, VersionNum = systemHtml.VersionNum }; newclass.AllSourceCode = APPCommon.ToSourceCode(systemHtml); return(newclass); }
//public void GetRequestHash(ActionExecutingContext actionExecutingContext) //{ // //actionExecutingContext.HttpContext.req //} private async static Task RunComposity(int requsetHash, HttpContext httpContext, RuntimeStepModel newrunmodel, ISqlSugarClient dbFactory, ISysDatabaseService codeService, IConfiguration config) { var cons = newrunmodel.ComposeEntity; if (cons.RunMode == RunMode.Coding) { if (newrunmodel.ComposeTemplate != null) { //TODO :add template } //Manager.RuntimeModels.Add(newrunmodel); else { var steps = FindSteps(cons.Guid, codeService); foreach (var s in steps) { object rebject = null; object DynaObject = null; if (s.IsUsingAuth.ToBool()) { await httpContext.AuthenticateAsync(); if (httpContext.User.Identity.Name != s.UserName || !httpContext.User.Identity.IsAuthenticated) { APPCommon.ResponseUnAuth((ActionExecutingContext)newrunmodel.Res["__actioncontext"], s.LoginUrl); return; } } var cacheKey = string.Concat(cons.Guid, "_", s.ExcuteType, "_", s.FlowStepType, "_", s.Guid, "_", s.ArgNames); object stepResult = APP.RuntimeCache.GetOrCreate(cacheKey, entry => { object newobj = null; APP.RuntimeCache.Set(cacheKey, newobj); return(newobj); }); if (s.IsUsingCache && stepResult != null) { rebject = stepResult; } else { if (!s.IsUsingCache || stepResult == null) { switch (s.FlowStepType) { case FlowStepType.Declare: { lock (lockobj) { //root.Usings[2].Name.ToString() // var rebject2 = Manager.GetData(spec.InParamter1, spec.InParamter2); var runcode = APP.FindOrAddRumtimeCode(s.Guid); var so_default = ScriptOptions.Default; if (runcode == null) { runcode = new RuntimeCode() { StepGuid = s.Guid, CodeLines = s.ProxyCode, }; List <string> dlls = new List <string>(); var isref = false; string dllbase = APPCommon.AppRootDir; if (!string.IsNullOrEmpty(s.TypeLib)) { var dllfile = dllbase + s.TypeLib; if (APP.DynamicReferenceDlls.Contains(dllfile)) { isref = false; } else { APP.DynamicReferenceDlls.Add(dllfile); isref = true; dlls.Add(dllfile); } } if (!string.IsNullOrEmpty(s.ReferenceDlls)) { isref = true; string[] dllnams = s.ReferenceDlls.Split(','); foreach (var n in dllnams) { APP.DynamicReferenceDlls.Add(dllbase + n); } dlls.AddRange(dllnams); } if (isref) { so_default = so_default.WithReferences(dlls.ToArray()); } so_default = so_default.WithReferences(Assembly.GetExecutingAssembly()); var state = CSharpScript.Create <object>(s.ProxyCode, so_default, typeof(Dictionary <string, object>)); runcode.Script = state; APP.RuntimeCodes.Add(s.Guid, runcode); } if (!string.IsNullOrEmpty(s.ReferenceDlls)) { string dllbase = APPCommon.AppRootDir; } rebject = runcode.Script.RunAsync(newrunmodel.Res).Result.ReturnValue; Logger.LogInfo(LoggerName, $"AComposityId id {s.AComposityId} ,step {s.StepOrder}, Declare: result {rebject} "); } } break; case FlowStepType.GetData: { DynaObject = HandleGetData(httpContext, newrunmodel, dbFactory, s); } break; case FlowStepType.CallMethod: { var methodsub = APP.GetMethodFromConfig(s.IsBuildIn.Value, s.TypeLib, s.TypeFullName, s.MethodName); var objParams = new List <object>(); if (!string.IsNullOrEmpty(s.ArgNames)) { objParams = newrunmodel.GetPoolResuce(s.ArgNames.Split(',')); } else { objParams = null; } try { if (methodsub.IsStatic) { DynaObject = methodsub.Invoke(null, objParams.ToArray()); } else { var instance = newrunmodel.Res[s.InstanceName]; DynaObject = methodsub.Invoke(instance, objParams.ToArray()); } } catch (Exception exp) { Logger.LogError(logName, "Run -> FlowStepType.CallMethod error,composity:{0},step:{1},-------------exception:{2}", cons.Id, s.Guid, LoggerHelper.GetExceptionString(exp)); break; } Logger.LogInfo(LoggerName, $"AComposityId id {s.AComposityId} ,step {s.StepOrder}, CallMethod {s.MethodName}: result {DynaObject} "); } break; case FlowStepType.Text: { rebject = s.OutPutText; } break; case FlowStepType.Function: { DynaObject = DealTheFunction(newrunmodel, s, httpContext); Logger.LogInfo(LoggerName, $"DealTheFunction: result {DynaObject} "); } break; case FlowStepType.RazorKey: try { rebject = stepResult = await HandleRazorKey(newrunmodel, s); } catch (Exception exp) { Logger.LogError(logName, $"parser RazorText wrong: {exp.Message}-------{LoggerHelper.GetExceptionString(exp)}"); } break; case FlowStepType.RazorText: try { rebject = stepResult = await HandleRazorText(newrunmodel, s, httpContext, s.ProxyCode); } catch (Exception exp) { Logger.LogError(logName, $"parser RazorText wrong: {exp.Message}-------{LoggerHelper.GetExceptionString(exp)}"); } break; case FlowStepType.RazorFile: try { var filePath = s.ProxyCode; string template = File.ReadAllText(Path.Combine(APPCommon.UserUploadBaseDir, filePath)); rebject = stepResult = await HandleRazorText(newrunmodel, s, httpContext, template); } catch (Exception exp) { Logger.LogError(logName, "parser RazorFile wrong: " + exp.Message + "-------" + LoggerHelper.GetExceptionString(exp)); } break; } if (rebject == null) { rebject = MagicExtension.BackToInst(DynaObject); } if (s.IsUsingCache) { APP.RuntimeCache.Set(cacheKey, rebject); } } } if (!string.IsNullOrEmpty(s.StorePoolKey) && rebject != null) { newrunmodel.SetComposityResourceValue(s.StorePoolKey, rebject); } } await CheckAndRunNextRuntimeComposity(requsetHash, httpContext, newrunmodel, dbFactory, codeService, config); } //Manager.RuntimeModels.Remove(newrunmodel); } }
public static void ConfigureSite(this IApplicationBuilder app, IServiceProvider serviceProvider, IWebHostEnvironment env, IHostApplicationLifetime lifetime) { app.UseStaticHostEnviroment(); APPCommon.WebHostEnvironment = env; lifetime.ApplicationStarted.Register(OnStart); //1:应用启动时加载配置,2:应用启动后注册服务中心 lifetime.ApplicationStopped.Register(UnRegService); //应用停止后从服务中心注销 //app.UseSimpleInjector(APPCommon.Resover.Container); app.UseDeveloperExceptionPage(); var appConfig = APPCommon.AppConfig; var UserDefaultStaticalDir = appConfig.GetDicstring("UserDefaultStaticalDir"); var webroot = Path.Combine(Directory.GetCurrentDirectory(), UserDefaultStaticalDir); if (!Directory.Exists(webroot)) { Directory.CreateDirectory(webroot); } CreatUserSpaceDirectory(app); APP.ConfigureSiteAllModules(app); APPCommon.ConfigureSite(app, env); app.UseStaticFiles(); //app.UseCookiePolicy(); //是否启用cookie隐私 var isEnableSwagger = Convert.ToBoolean(appConfig.GetDicstring("isEnableSwagger"));; if (isEnableSwagger) { //启用中间件服务生成Swagger作为JSON终结点 app.UseSwagger(); //启用中间件服务对swagger-ui,指定Swagger JSON终结点 app.UseSwaggerUI(c => { c.SwaggerEndpoint("/swagger/v1/swagger.json", "My API V1"); }); } app.UsePhp(new PhpRequestOptions() { RootPath = APPCommon.UserUploadBaseDir, ScriptAssembliesName = new string[] { "UniOrm.PHP" } }); app.UseRouting(); app.UseAuthentication(); app.UseAuthorization(); var isAllowCros = Convert.ToBoolean(appConfig.GetDicstring("isAllowCros")); if (isAllowCros) { app.UseCors("allow_all"); } var AreaName = appConfig.GetDicstring("AreaName"); //url 重写。。。 // var rewrite = new RewriteOptions() //.AddRewrite("first", "home/index", 301); // app.UseRewriter(rewrite); //用户session服务 app.UseSession(); //using (var scope = serviceProvider.CreateScope()) //{ // var _actionProvider = scope.ServiceProvider // .GetService<DynamicActionProvider>(); // var _dynamicChangeTokenProvider = scope.ServiceProvider // .GetService<DynamicChangeTokenProvider>(); // WebSetup.BuildAllDynamicActions(_actionProvider, _dynamicChangeTokenProvider).GetAwaiter().GetResult(); //} app.UseTheme();//启用theme中间件 app.UseEndpoints(endpoints => { //endpoints.MapControllerRoute( // name: "default", // pattern: "{controller=Home}/{action=Index}/{id?}"); endpoints.MapAreaControllerRoute(name: "areas", "areas", pattern: "{area:exists}/{controller=Home}/{action=Index}/{id?}"); //routes.MapRoute("areaRoute", "{"+ AreaName + ":exists}/{controller}/{action=Index}/{id?}"); endpoints.MapControllerRoute( "factory", "/fact/{action}", new { controller = "Fact", action = "Index" }); endpoints.MapControllerRoute( "cmsinstall", "/CmsInstall/{action}", new { controller = "CmsInstall", action = "Index" }); endpoints.MapControllerRoute( name: "default", pattern: "{controller=Home}/{action=Index}/{id?}"); endpoints.MapControllerRoute( "all", @"{**path}", new { controller = "FactoryBuilder", action = "Index" }); endpoints.MapRazorPages(); }); // APPCommon.Resover.Container.Verify(); // BuildAllDynamicActions(); }
// This method gets called by the runtime. Use this method to add services to the container. public static void ConfigureServices(this IServiceCollection services) { APP.ConfigureSiteAllModulesServices(services); services.AddMediatR(typeof(WebSetup).Assembly); services.AddSingleton <IHttpContextAccessor, HttpContextAccessor>(); services.AddSingleton <ICompiler, Compiler>() .AddSingleton <DynamicActionProvider>() .AddSingleton <DynamicChangeTokenProvider>() .AddSingleton <IActionDescriptorProvider>(provider => provider.GetRequiredService <DynamicActionProvider>()) .AddSingleton <IActionDescriptorChangeProvider>(provider => provider.GetRequiredService <DynamicChangeTokenProvider>()); services.Configure <CookiePolicyOptions>(options => { // This lambda determines whether user consent for non-essential cookies is needed for a given request. options.CheckConsentNeeded = context => true; options.MinimumSameSitePolicy = SameSiteMode.None; }); services.AddSession(o => { o.IdleTimeout = TimeSpan.FromSeconds(60 * 60); o.Cookie.HttpOnly = true; }); // 配置授权 var appConfig = APPCommon.AppConfig; var signingkey = appConfig.GetDicstring("JWT.IssuerSigningKey"); var backendfoldername = appConfig.GetDicstring("backend.foldername"); var AuthorizeCookiesName = appConfig.GetDicstring("AuthorizeCookiesName"); var OdicCookiesName = appConfig.GetDicstring("OdicCookiesName"); var identityserver4url = appConfig.GetDicstring("Identityserver4.url"); var Identityserver4ApiResouceKey = appConfig.GetDicstring("Identityserver4.ApiResouceKey"); var idsr4_ClientId = appConfig.GetDicstring("idsr4_ClientId"); var idsr4_ClientSecret = appConfig.GetDicstring("idsr4_ClientSecret"); var idsr4_ReponseType = appConfig.GetDicstring("idsr4_ReponseType"); var OauthClientConfig_scopes = appConfig.GetDicstring("OauthClientConfig_scopes"); var IsUsingIdentityserverClient = Convert.ToBoolean(appConfig.GetDicstring("IsUsingIdentityserverClient")); var IsUsingIdentityserver4 = Convert.ToBoolean(appConfig.GetDicstring("IsUsingIdentityserver4")); var isAllowCros = Convert.ToBoolean(appConfig.GetDicstring("isAllowCros")); var AllowCrosUrl = appConfig.GetDicstring("AllowCrosUrl"); var IsUserAutoUpdatedb = Convert.ToBoolean(appConfig.GetDicstring("IsUserAutoUpdatedb")); var isEnableSwagger = Convert.ToBoolean(appConfig.GetDicstring("isEnableSwagger"));; //services.AddMvcCore().AddAuthorization().AddJsonFormatters(); var IsUsingLocalIndentity = Convert.ToBoolean(appConfig.GetDicstring("IsUsingLocalIndentity")); // var IsUsingDB = Convert.ToBoolean(appConfig.GetDicstring("IsUsingDB")); var IsUsingCmsGlobalRouterFilter = Convert.ToBoolean(appConfig.GetDicstring("IsUsingCmsGlobalRouterFilter")); if (IsUserAutoUpdatedb) { InitDbMigrate(); } APP.InitDbMigrate(); APPCommon.AppConfig.LoadDBDictionary(); APPCommon.LoadLocalLangs(); if (isEnableSwagger) { //注册Swagger生成器,定义一个和多个Swagger 文档 services.AddSwaggerGen(c => { c.SwaggerDoc("v1", new OpenApiInfo() { Version = "v1", Title = " API", Description = "A simple example ASP.NET Core Web API", Contact = new OpenApiContact { Name = "Oliver Wa", Email = string.Empty, Url = new Uri("http://www.66wave.com/") }, License = new OpenApiLicense { Name = "许可证名字", Url = new Uri("http://www.66wave.com/") } }); }); } //services.AddAuthorization(options => //{ // options.AddPolicy("Adult1", policy => // { // }); // options.AddPolicy("Adult2", policy => // { // }); //}); SetupIdentity(services, appConfig, signingkey, backendfoldername, AuthorizeCookiesName, OdicCookiesName, identityserver4url, Identityserver4ApiResouceKey, idsr4_ClientId, idsr4_ClientSecret, OauthClientConfig_scopes, IsUsingIdentityserverClient, IsUsingIdentityserver4, IsUsingLocalIndentity, idsr4_ReponseType); if (isAllowCros) { services.AddCors(options => { options.AddPolicy("allow_all", bb => { if (AllowCrosUrl == "*") { bb = bb.AllowAnyOrigin(); } else { var allusrs = AllowCrosUrl.Split(','); bb = bb.WithOrigins(allusrs); } bb.AllowAnyOrigin(); }); }); } // _ = services.AddMvc(o => _是什么 IMvcBuiler services.AddRazorPages(c => { }); services.Configure <RazorViewEngineOptions>(options => { options.AreaViewLocationFormats.Add("~/Areas/" + appConfig.AdminAreas + "/{ 2}/Views/{1}/{0}.cshtml"); options.AreaViewLocationFormats.Add("~/Areas/" + appConfig.AdminAreas + "/{2}/Views/Shared/{0}.cshtml"); options.ViewLocationExpanders.Add(new TemplateViewLocationExpander(Configuration)); }); services.AddControllersWithViews(o => { o.Filters.Add <WorkAuthorzation>(); // 添加身份验证过滤器 o.Filters.Add <ControllerActionFilter>(); if (IsUsingCmsGlobalRouterFilter) { o.Filters.Add <GlobalActionFilter>(); //o.Filters.Add<WorkAuthorzation>(); } }) .AddRazorRuntimeCompilation(options => { //var libraryPath = Path.GetFullPath( // Path.Combine(AppRootDir , "UniOrm.Startup.Web")); options.FileProviders.Add(new PhysicalFileProvider(APPCommon.AppRootDir)); }) .AddNewtonsoftJson(options => { options.SerializerSettings.ContractResolver = new DefaultContractResolver(); CustomizedDateTimeConverer converer = new CustomizedDateTimeConverer(); //然后需要使用到的dto对象或者实体对象,打上这个特性即可,如下所示: [JsonConverter(typeof(CustomizedDateTimeConverer), “yyyy - MM - dd HH: mm:ss”)] options.SerializerSettings.Converters.Add(converer); }) .AddRazorPagesOptions( options => { var razorDir = "/" + appConfig.UserSpaceDir + "/RazoPages"; razorDir.ToServerFullPathEnEnsure(); options.RootDirectory = razorDir; options.Conventions.AuthorizePage("/test1", "OnlyAdminAccess"); options.Conventions.AuthorizeFolder("/Admin/", "OnlyAdminAccess"); //url重写 //options.Conventions.AddPageRoute("/Post", "Post/{year}/{month}/{day}"); //以下示例将 URL www.domain.com/product 映射到Razor 页面 “extras”文件夹“products.cshtml”文件: //options.Conventions.AddPageRoute("/extras/products", "product"); //最后一个例子说明将所有请求映射到单个文件。如果站点内容存储在特定位置(数据库,Markdown文件),并且由单个文件(例如 “index.cshtml” ) //负责根据 URL 定位内容,然后将其处理为HTML,则可以执行此操作: //options.Conventions.AddPageRoute("/index", "{*url}"); //默认关闭 防止跨站请求伪造(CSRF / XSRF)攻击 options.Conventions.ConfigureFilter(new IgnoreAntiforgeryTokenAttribute()); }) .ConfigureApplicationPartManager(m => { //多个项目中分离Asp.Net Core Mvc的Controller和Areas //var homeType = typeof(Web.Controllers.Areas.HomeController); //var controllerAssembly = homeType.GetTypeInfo().Assembly; //var feature = new ControllerFeature(); //m.ApplicationParts.Add(new AssemblyPart(controllerAssembly)); //m.PopulateFeature(feature); //services.AddSingleton(feature.Controllers.Select(t => t.AsType()).ToArray()); }) .InitializeTagHelper <FormTagHelper>((helper, context) => helper.Antiforgery = false); var asses = AppDomain.CurrentDomain.GetAssemblies(); // services.AddControllers().AddControllersAsServices(); //控制器当做实例创建 // services.InitAutofac(asses); // APPCommon.Builder.RegisterType<IHttpContextAccessor, HttpContextAccessor>(); appConfig.ResultDictionary = appConfig.ResultDictionary; APP.ApplicationServices = services.BuildServiceProvider(); APP.SetServiceProvider(); }