Пример #1
0
        // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
        public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
        {
            loggerFactory.AddConsole();

            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }

            var path = Path.Combine(env.ContentRootPath); 
            var provider = new PhysicalFileProvider(path);
            provider.Watch("*.*");

            // Set up custom content types -associating file extension to MIME type
            var contentTypeProvider = new FileExtensionContentTypeProvider();
            // Add new mappings
            contentTypeProvider.Mappings[".hdr"] = "application/octet-stream";
            contentTypeProvider.Mappings[".babylon"] = "application/json";
            contentTypeProvider.Mappings[".fx"] = "text/plain";
            contentTypeProvider.Mappings[".map"] = "text/plain";

            var options = new StaticFileOptions()
            {
                RequestPath = "",
                FileProvider = provider,
                ContentTypeProvider = contentTypeProvider
            };
            app.UseStaticFiles(options);
        }
Пример #2
0
            public static IEnumerable <IChangeToken> MakeChangeTokens(IEnumerable <string> names)
            {
                if (string.IsNullOrEmpty(FileCacheDependency.Directory))
                {
                    return(null);
                }
                if (!Directory.Exists(FileCacheDependency.Directory))
                {
                    Directory.CreateDirectory(FileCacheDependency.Directory);
                }
                var fileProvider = new PhysicalFileProvider(FileCacheDependency.Directory);

                lock (_rwLock)
                {
                    var changeTokens = new List <IChangeToken>();
                    foreach (var name in names)
                    {
                        var filePath = GetFilePathForName(name);
                        if (filePath == null)
                        {
                            continue;
                        }
                        try
                        {
                            var filePathAsDirectory = Path.GetDirectoryName(filePath);
                            if (!Directory.Exists(filePathAsDirectory))
                            {
                                Directory.CreateDirectory(filePathAsDirectory);
                            }
                            if (!File.Exists(filePath))
                            {
                                WriteBodyForName(name, filePath);
                            }
                        }
                        catch { };
                        changeTokens.Add(fileProvider.Watch(filePath));
                    }
                    return(changeTokens);
                }
            }
Пример #3
0
        /// <summary>
        /// 服务启动
        /// </summary>
        public void Start()
        {
            try
            {
                var builder       = new ConfigurationBuilder().AddJsonFile("appsettings.json", optional: true, reloadOnChange: true);
                var configuration = builder.Build();

                try
                {
                    //首次启动 加载
                    InitServices(configuration);
                }
                catch (Exception ex)
                {
                    Logger.Error("服务启动加载配置异常", ex);
                }

                IFileProvider fileProvider = new PhysicalFileProvider(AppDomain.CurrentDomain.BaseDirectory);

                ChangeToken.OnChange(() => fileProvider.Watch("appsettings.json"), () =>
                {
                    //等待程序重新加载json
                    Thread.Sleep(500);
                    try
                    {
                        ServicesChanged(configuration);
                    }
                    catch (Exception ex)
                    {
                        Logger.Error("配置文件更改重新加载配置异常", ex);
                    }
                });
            }
            catch (Exception ex)
            {
                Logger.Error("服务启动异常", ex);
            }
        }
Пример #4
0
        static void Main(string[] args)
        {
            /*
             * Assembly assembly = Assembly.GetEntryAssembly();
             * String ans = new ServiceCollection().AddSingleton<IFileProvider>(new EmbeddedFileProvider(assembly))
             * .AddSingleton<IFileManager, FileManager>()
             * .BuildServiceProvider().GetService<IFileManager>().ReadAllTextAsync("data").Result;
             *
             * //直接读取内嵌资源文件
             * Stream stream = assembly.GetManifestResourceStream($"{assembly.GetName().Name}.data");
             * byte[] buffer = new byte[stream.Length];
             * stream.Read(buffer, 0, buffer.Length);
             * string content = Encoding.UTF8.GetString(buffer);
             * Console.WriteLine(content);
             * Console.WriteLine(ans);
             * Debug.Assert(content == ans);
             * //String ans=new ServiceCollection().AddSingleton<IFileProvider>(new PhysicalFileProvider(@"/Users/qinyuanlong/DotNet_core_x1/CallerMemberNameConsole/FileProviderTest"))
             * //    .AddSingleton<IFileManager, FileManager>()
             * //    .BuildServiceProvider().GetService<IFileManager>().ReadAllTextAsync("data").Result;
             * //Console.WriteLine(ans);
             * //-----------------------
             * // Debug.Assert(ans == File.ReadAllText(@"../data"));
             * //  Console.WriteLine("Hello World!");
             * //new ServiceCollection().AddSingleton<IFileProvider>(new PhysicalFileProvider(@"/Users/qinyuanlong/DotNet_core_x1/CallerMemberNameConsole/FileProviderTest"))
             * //    .AddSingleton<IFileManager, FileManager>()
             * //    .BuildServiceProvider().GetService<IFileManager>().ShowStructure(
             * //    (layer, name) => Console.WriteLine("{0}{1}", new string('\t', layer), name));
             */
            //监控文件的变化
            IFileProvider fileProvider = new PhysicalFileProvider(@"/Users/qinyuanlong/DotNet_core_x1/CallerMemberNameConsole/FileProviderTest");

            ChangeToken.OnChange(() => fileProvider.Watch("data"), () => LoadFileAsync(fileProvider));
            while (true)
            {
                File.WriteAllText(@"/Users/qinyuanlong/DotNet_core_x1/CallerMemberNameConsole/FileProviderTest/data", DateTime.Now.ToString());
                Task.Delay(5000).Wait();
            }
        }
Пример #5
0
        static void Main(string[] args)
        {
            //  Console.WriteLine("Hello World!");

            /*
             * new ServiceCollection().AddSingleton<IFileProvider>(new PhysicalFileProvider(@"C:\Users\95644\Documents\DotNet_core_x1\fileSystem01\fileSystem01"))
             *    .AddSingleton<IFileManager, FileManager>()
             *    .BuildServiceProvider().GetService<IFileManager>()
             *    .ShowStructure((layer, name) =>
             *    Console.WriteLine($"{new string('\t', layer)}{name}"));
             * string ans= new ServiceCollection().AddSingleton<IFileProvider>(new PhysicalFileProvider(@"C:\Users\95644\Documents\DotNet_core_x1\fileSystem01\fileSystem01"))
             * .AddSingleton<IFileManager, FileManager>()
             * .BuildServiceProvider().GetService<IFileManager>()
             * .ReadAllTextAsync("data.txt").Result;
             * Console.WriteLine(ans);
             * //利用EmbeddedFileprovider读取文件
             * string ans = new ServiceCollection().AddSingleton<IFileProvider>(new PhysicalFileProvider(@"C:\Users\95644\Documents\DotNet_core_x1\fileSystem01\fileSystem01"))
             *    .AddSingleton<IFileManager, FileManager>()
             *    .BuildServiceProvider().GetService<IFileManager>()
             *    .ReadAllTextAsync("data.txt").Result;
             * Assembly assembly = Assembly.GetEntryAssembly();
             * //直接读取内嵌资源文件
             * Stream stream = assembly.GetManifestResourceStream($"{assembly.GetName().Name}.data.txt");
             * byte[] buffer = new byte[stream.Length];
             * stream.Read(buffer, 0, buffer.Length);
             * string content = Encoding.UTF8.GetString(buffer);
             * Console.WriteLine($"{ans}\n{content}");   */

            //监控文件的变化
            IFileProvider fileProvider = new PhysicalFileProvider(@"C:\Users\95644\Documents\DotNet_core_x1\fileSystem01\fileSystem01");

            ChangeToken.OnChange(() => fileProvider.Watch("data.txt"), () => LoadFileAsync(fileProvider));
            while (true)
            {
                File.WriteAllText(@"C:\Users\95644\Documents\DotNet_core_x1\fileSystem01\fileSystem01\data.txt", DateTime.Now.ToString());
                Task.Delay(5000).Wait();
            }
        }
Пример #6
0
        static void Main(string[] args)
        {
            var mre        = new ManualResetEventSlim();
            var memoryTask = Task.Run(() =>
            {
                while (!mre.IsSet)
                {
                    Console.SetCursorPosition(0, 0);
                    Console.WriteLine($"Process ID: {Environment.ProcessId}");
                    Console.Write("Working, press any key to stop...");

                    Console.WriteLine();
                    GCUtils.PrintInfoAboutLastCycle();

                    Thread.Sleep(1000);
                }
            });

            var task = Task.Run(() =>
            {
                while (!mre.IsSet)
                {
                    //note: PhysicalFileProvider under the hood uses unmanaged resources (see https://github.com/dotnet/runtime/blob/master/src/libraries/System.IO.FileSystem.Watcher/src/System/IO/FileSystemWatcher.Win32.cs#L32)
                    try
                    {
                        var fp = new PhysicalFileProvider(Path.GetTempPath());
                        fp.Watch("*.*");
                    }
                    catch (Exception) { }
                }
            });

            Console.ReadKey();
            mre.Set();

            Task.WaitAll(task, memoryTask);
            Console.WriteLine("OK, bye!");
        }
Пример #7
0
        /// <summary>
        /// 启动服务
        /// </summary>
        /// <returns></returns>
        public Task SetServer()
        {
            g = new Gateway();
            g.HttpOptions(h =>
            {
                h.Port           = ConfigSettings.Instance.GateWayPort; //端口
                h.LogToConsole   = true;                                //开启控制台日志显示
                h.LogLevel       = BeetleX.EventArgs.LogType.Warring;   //日志等级
                h.WriteLog       = true;                                //是否写日志
                h.UseIPv6        = true;                                //使用ipv6
                h.SessionTimeOut = 5000;                                //设置超时时间
            });
            ConfigSettings.Instance.HostServers.ForEach(k =>
            {
                g.SetServer(k.Host, k.MaxConnections).AddUrl(k.UrlPrex, k.HashPattern, k.Weight, k.MaxRps);
            });
            g.LoadPlugin(typeof(RequestFilter).Assembly);
            g.Routes.Default.Pluginer.SetRequesting("Requesting");
            g.Routes.Default.Pluginer.SetAgentRequesting("Agent");
            g.Routes.Default.Pluginer.SetRequested("Requested");
            g.Routes.Default.Pluginer.SetHeaderWriting("Headerwrite");
            g.Pluginer.SetResponseError("responseError");
            g.AgentMaxConnection  = 10000; //代理的最大连接数
            g.AgentMaxSocketError = 10000; //最大错误数

            /*
             * (支持两种动态添加url的方式)
             * 1,监视配置文件变化,发生改变时更新服务列表
             * 2,页面添加,访问http://iP+端口+/__admin/
             */
            IFileProvider fileProvider = new PhysicalFileProvider(AppDomain.CurrentDomain.BaseDirectory);

            ChangeToken.OnChange(() => fileProvider.Watch("ApiConfig.json"), () => LoadAppSeetings());
            g.Open();
            g.LoadPlugin(typeof(Bumblebee.Configuration.Management).Assembly);
            return(Task.CompletedTask);
        }
Пример #8
0
        public void GetFileProvider()
        {
            var fp = new PhysicalFileProvider(TempPath);

            fp.Watch("*.*");
        }
Пример #9
0
        public static void Test(string host, int port)
        {
            LoggerManager.ServerLoggerFactory.AddConsole(LogLevel.Information);

            string path       = Path.Combine(Directory.GetCurrentDirectory(), "config.json");
            var    configRoot = new ConfigurationBuilder()
                                .AddJsonFile(path)
                                .Build();

            var serviceAuthorizer = new DefaultServiceAuthorizer(configRoot.GetDefaultServiceAuthorizeConfig(), LoggerManager.ServerLoggerFactory);
            var loginValidator    = new DefaultLoginValidator(configRoot.GetDefaultLoginValidatorConfig(), LoggerManager.ServerLoggerFactory);

            IFileProvider fileProvider = new PhysicalFileProvider(Directory.GetCurrentDirectory());

            ChangeToken.OnChange(() => fileProvider.Watch("config.json"), () =>
            {
                configRoot.Reload();
                serviceAuthorizer.LoadConfig(configRoot.GetDefaultServiceAuthorizeConfig());
                loginValidator.LoadConfig(configRoot.GetDefaultLoginValidatorConfig());
            });

            new ZipkinBootstrapper("XNodeDemoServer", System.Net.IPAddress.Parse(host), (short)port)
            .ZipkinAt("192.168.87.131")
            .WithSampleRate(1.0)
            .Start();

            //var serviceProvider = CreateDefaultServiceProvider();
            //var serviceProvider = CreateAutofacServiceProvider();
            //serviceProvider.LoggerFactory = LoggerManager.ServerLoggerFactory;

            var serverConfig = configRoot.GetServerConfig();
            var container    = GetAutofacContainer();
            //var serializer = new MsgPackSerializer(LoggerManager.ServerLoggerFactory);
            var serializer = new ProtoBufSerializer(LoggerManager.ServerLoggerFactory);

            var nodeServer = new NodeServerBuilder()
                             //.ConfigServerInfo(host, port)
                             .ApplyConfig(serverConfig)
                             //.ConfigServiceProvider(serviceProvider)
                             .ConfigSerializer(serializer)
                             .ConfigLoginValidator(loginValidator)
                             .AddServiceProcessor(new ZipkinProcessor())
                             .AddServiceProcessor(new ServiceAuthorizeProcessor(serviceAuthorizer))
                             .UseDotNetty(serverConfig.ServerInfo)
                             .UseAutofac(container)
                             .Build();

            //UseServicePublish(configRoot, serializer, nodeServer);

            nodeServer.OnStarted += (arg) =>
            {
                System.Console.WriteLine("Server started:");
                System.Console.WriteLine($"Host={arg.Host}, Port={arg.Port}");
                var list = arg.Routes.Where(r => r.Enabled).Select(r => new { r.ServiceName }).Distinct();
                foreach (var item in list)
                {
                    System.Console.WriteLine(item.ServiceName);
                }

                //nodeServer.Disable(10002);
                //nodeServer.Enable(10002);
            };

            nodeServer.OnStopped += (arg) =>
            {
                System.Console.WriteLine("Server stopped:");
                System.Console.WriteLine($"Host={arg.Host}, Port={arg.Port}");
                var list = arg.Routes.Where(r => r.Enabled).Select(r => new { r.ServiceName }).Distinct();
                foreach (var item in list)
                {
                    System.Console.WriteLine(item.ServiceName);
                }
            };

            nodeServer.StartAsync().Wait();

            System.Console.ReadLine();

            nodeServer.StopAsync().Wait();

            System.Console.WriteLine("Stop");
        }
Пример #10
0
 public IChangeToken Watch(string filter)
 => _provider.Watch(filter.ToLower());
Пример #11
0
        private static void WatchForFileChanges()
        {
            var fileChangeToken = _FileProvider.Watch("*.*");

            fileChangeToken.RegisterChangeCallback(Notify, default);
        }
 public IChangeToken Watch(string filter)
 {
     return(_physicalFileProvider.Watch(filter));
 }
Пример #13
0
        /// <summary>
        /// 文件监听(读取)
        /// </summary>
        /// <param name="Module"></param>
        internal static void MonitorRead(FileModule Module)
        {
            IFileProvider FileProvider = new PhysicalFileProvider(Module.Path);

            FileReaderOnChaged(() => FileProvider.Watch(Module.Pattern), () => Module.Action.Invoke());
        }
 /// <summary>
 /// Creates a token that watches for changes
 /// </summary>
 /// <param name="filter">Watch filter</param>
 /// <returns>Change token</returns>
 public IChangeToken Watch(string filter)
 {
     ValidateProvider().Wait();
     return(_provider.Watch(filter));
 }
Пример #15
0
        private static void RegisterModulesDependencies(IServiceCollection services, LeafModulesOptions options)
        {
            // TODO: 어셈블리에서 디펜던시를 판단해서 등록하는 코드를 분리할 것
            var fileProvider = new PhysicalFileProvider(options.BasePath);

            var dllFiles = fileProvider.GetDirectoryContents("");

            if (!dllFiles.Exists)
            {
                return;
            }

            foreach (var dllFile in dllFiles
                     .Where(f => !f.IsDirectory && f.Exists &&
                            Path.GetExtension(f.Name).Equals(@".dll", StringComparison.OrdinalIgnoreCase)))
            {
                // TODO: try catch 처리
                var assembly = AssemblyLoadContext.Default.LoadFromAssemblyPath(dllFile.PhysicalPath);

                var classes =
                    from type in assembly.GetTypes()
                    let attribute = type.GetCustomAttribute(typeof(DependencyServiceAttribute), true)
                                    where attribute != null
                                    select new { Type = type, Attribute = (DependencyServiceAttribute)attribute };

                foreach (var serviceClass in classes)
                {
                    if (serviceClass.Attribute.ImplemenType != null)
                    {
                        // TODO: ImplementType을 지정한 인터페이스를 구현한 클래스가 아닐 경우 예외를 발생시킬지 결정 - 예외 발생 시 시스템 스타트 오류 처리 필요
                        if (!serviceClass.Attribute.ImplemenType.IsAssignableFrom(serviceClass.Type))
                        {
                            continue;
                        }

                        // TODO: 지정한 인터페이스 형식으로 등록된 클래스가 있을 경우의 처리

                        if (serviceClass.Attribute.Singleton)
                        {
                            services.AddSingleton(serviceClass.Attribute.ImplemenType, serviceClass.Type);
                        }
                        else
                        {
                            services.AddTransient(serviceClass.Attribute.ImplemenType, serviceClass.Type);
                        }
                    }
                    else
                    {
                        if (serviceClass.Attribute.Singleton)
                        {
                            services.AddSingleton(serviceClass.Type);
                        }
                        else
                        {
                            services.AddTransient(serviceClass.Type);
                        }
                    }
                }
            }

            // TODO: Dll 파일의 변경이 있을 때 어플리케이션을 셧다운 - 재시작은 운영체제에 일임 (systemd 나 supervisord 이용)
            // https://www.blakepell.com/asp-net-core-ability-to-restart-your-site-programatically-updated-for-2-0
            // https://www.blakepell.com/asp-net-core-ability-to-restart-your-site-programmatically

            var token = fileProvider.Watch("**/*.dll");

            token.RegisterChangeCallback(state => { options.Shutdown?.Invoke(); }, null);
        }
Пример #16
0
        private void WatchForFile()
        {
            IChangeToken changeToken = fileProvider.Watch(WatchFileName);

            TokenCallback = changeToken.RegisterChangeCallback(w => GetDocumentScheme(), null);
        }
        /// <summary>
        /// Does the work.
        /// </summary>
        /// <param name="services">The services.</param>
        /// <param name="cancellation">The cancellation.</param>
        /// <returns></returns>
        public async override Task DoWorkAsync(IServiceProvider services, CancellationToken cancellation)
        {
            if (_initialDelay.HasValue)
            {
                await Task.Delay(_initialDelay.Value, cancellation);
            }

            using (var scope = services.CreateScope())
            {
                var logger = scope.ServiceProvider.GetRequiredService <ILogger <FileWatcherBackgroundOperation> >();

                if (string.IsNullOrEmpty(_directoryToWatch) || !Directory.Exists(_directoryToWatch))
                {
                    logger.LogWarning("'ImageDirectory' directory not found from configuration");
                    return;
                }
                PhysicalFileProvider fileProvider = null;
                try
                {
                    fileProvider = new PhysicalFileProvider(_directoryToWatch, ExclusionFilters.Sensitive);
                    logger.LogInformation("Starting to watch for '{filterGlobb}' inside '{directoryToWatch}'", _filterGlobb, _directoryToWatch);

                    int counter = 0;
                    while (!cancellation.IsCancellationRequested)
                    {
                        IChangeToken change_token = fileProvider.Watch(_filterGlobb);
                        if (change_token == null)
                        {
                            break;
                        }

                        var tcs = new TaskCompletionSource <int>();
                        (IDisposable change, IDisposable cancel)regs = (null, null);
                        try
                        {
                            regs.cancel = cancellation.Register((token) =>
                            {
                                tcs.TrySetCanceled((CancellationToken)token);
                            }, cancellation, false);

                            regs.change = change_token.RegisterChangeCallback(async state =>
                            {
                                counter++;
                                int?result;
                                int fail_count = _failRetryCount.GetValueOrDefault(1);
                                do
                                {
                                    result = _onChangeFunction?.Invoke(counter, _directoryToWatch, _filterGlobb);
                                    logger.LogInformation("'{filterGlobb}' changed {counter} of times, scheduled action with {result}", _filterGlobb,
                                                          counter, result.GetValueOrDefault(-1));

                                    await Task.Delay((_failRetryCount.GetValueOrDefault(1) - fail_count) << 9, cancellation);
                                }while (--fail_count > 0 && result.GetValueOrDefault(-1) != 0);

                                ((TaskCompletionSource <int>)state).TrySetResult(counter);
                            }, tcs);

                            var cntr = await tcs.Task.ConfigureAwait(false);

                            await Task.Delay(250, cancellation);
                        }
                        catch (TaskCanceledException ex)
                        {
                            logger.LogWarning(ex, "cancelled");
                        }
                        finally
                        {
                            regs.change?.Dispose(); regs.change = null;
                            regs.cancel?.Dispose(); regs.cancel = null;
                        }
                    }
                }
                catch (Exception)
                {
                    throw;
                }
                finally
                {
                    fileProvider?.Dispose();
                }
            }
        }
Пример #18
0
        public static IApplicationBuilder UseAdminPage(this IApplicationBuilder app,
                                                       IConfiguration configuration,
                                                       ILoggerFactory loggerFactory)
        {
            var cubesConfig = configuration.GetCubesConfiguration();
            var zipPath     = configuration.GetCubesConfiguration().AdminPath;
            var logger      = loggerFactory.CreateLogger <Content>();

            if (!File.Exists(zipPath))
            {
                logger.LogWarning($"Could not load 'Cubes Management' application from path: {zipPath}");
                return(app);
            }
            else
            {
                logger.LogInformation("Serving 'Cubes Management' from {contentPath}, request path '{requestPath}'.", zipPath, "/admin");
            }

            // Currently Compressed FileProvider seems to be broken!
            var           useCompressedFileProvider = false;
            IFileProvider fileProvider;

            if (useCompressedFileProvider)
            {
                fileProvider = new CompressedFileProvider(zipPath);

                // Inform for changes on CompressedFileProvider
                var fileName = Path.GetFileName(zipPath);
                var debouncer = new Debouncer();
                void call() => logger.LogInformation("File {cubesAdminPath} changed, 'Cubes Management' should be reloaded!", fileName);

                ChangeToken.OnChange(
                    () => fileProvider.Watch(fileName),
                    () => debouncer.Debounce(call));
            }
            else
            {
                var tempFolder = Path.Combine(cubesConfig.TempFolder, "CubesManagement");
                DeployZipOnTemp(tempFolder, zipPath);
                fileProvider = new PhysicalFileProvider(tempFolder);

                // Setup file changes mechanism for zip file
                var fileName = Path.GetFileName(zipPath);
                var pfp      = new PhysicalFileProvider(Path.GetDirectoryName(zipPath));
                if (!RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
                {
                    pfp.UsePollingFileWatcher = true;
                }
                var debouncer = new Debouncer();
                void call()
                {
                    DeployZipOnTemp(tempFolder, zipPath);
                    logger.LogInformation($"File {fileName} changed, 'Cubes Management' should be reloaded!");
                }

                ChangeToken.OnChange(
                    () => pfp.Watch(fileName),
                    () => debouncer.Debounce(call));
            }

            var options = new FileServerOptions
            {
                FileProvider       = fileProvider,
                RequestPath        = "",
                EnableDefaultFiles = true,
            };

            options.DefaultFilesOptions.DefaultFileNames.Clear();
            options.DefaultFilesOptions.DefaultFileNames.Add("index.html");
            app.Map(new PathString("/admin"), builder =>
            {
                builder.UseFileServer(options);
                builder.Use(async(context, next) =>
                {
                    await next();
                    var fullRequest = context.Request.PathBase.Value + context.Request.Path.Value;
                    if (context.Response.StatusCode == 404 &&
                        !Path.HasExtension(fullRequest) &&
                        !Directory.Exists(fullRequest))
                    {
                        // Fall back to SPA entry point
                        context.Response.StatusCode = 200;
                        if (useCompressedFileProvider)
                        {
                            await fileProvider.GetFileInfo("index.html")
                            .CreateReadStream()
                            .CopyToAsync(context.Response.Body);
                        }
                        else
                        {
                            await context.Response
                            .WriteAsync(File.ReadAllText(fileProvider.GetFileInfo("index.html").PhysicalPath));
                        }
                    }
                });
            });

            return(app);
        }
Пример #19
0
        static void Main(string[] args)
        {
            System.Console.InputEncoding  = Encoding.UTF8;
            System.Console.OutputEncoding = Encoding.UTF8;

            var    dir      = Directory.GetCurrentDirectory();
            var    fileName = "config.json";
            string path     = Path.Combine(dir, fileName);

            var configRoot = new ConfigurationBuilder()
                             .AddJsonFile(path)
                             .Build();

            var name         = configRoot.GetValue <string>("name");
            var globalConfig = configRoot.GetGlobalConfig();

            GlobalSettings.Apply(globalConfig);

            var serviceProxyManager = new ServiceProxyManager();

            container = GetAutofacContainer(serviceProxyManager);

            #region Client配置

            var clientConfig = configRoot.GetClientConfig();

            LoggerManager.ClientLoggerFactory.AddConsole(LogLevel.Information);

            var clientSerializer = new ProtoBufSerializer(LoggerManager.ClientLoggerFactory);

            var serviceCaller = new ServiceCallerBuilder()
                                //.Append(new ZipkinCaller(clientSerializer))
                                .UseRetry()
                                .UseDefault()
                                .Build();

            if (clientConfig.ServiceProxies != null)
            {
                foreach (var config in clientConfig.ServiceProxies)
                {
                    var serviceProxy = new ServiceProxy(
                        config.ProxyName,
                        config?.Services,
                        serviceCaller)
                                       .AddServices(config.ProxyTypes)
                                       .AddClients(
                        new NodeClientBuilder()
                        .ConfigConnections(config.Connections)
                        .ConfigSerializer(clientSerializer)
                        .ConfigLoginHandler(new DefaultLoginHandler(configRoot.GetDefaultLoginHandlerConfig(config.ProxyName), clientSerializer))
                        .UseDotNetty()
                        .Build()
                        );

                    serviceProxyManager.Regist(serviceProxy);
                }
            }

            #endregion

            #region Server配置

            LoggerManager.ServerLoggerFactory.AddConsole(LogLevel.Information);

            var loginValidator    = new DefaultLoginValidator(configRoot.GetDefaultLoginValidatorConfig(), LoggerManager.ServerLoggerFactory);
            var serviceAuthorizer = new DefaultServiceAuthorizer(configRoot.GetDefaultServiceAuthorizeConfig(), LoggerManager.ServerLoggerFactory);

            var serverConfig = configRoot.GetServerConfig();
            var nodeServer   = new NodeServerBuilder()
                               .ApplyConfig(serverConfig)
                               .ConfigSerializer(new ProtoBufSerializer(LoggerManager.ServerLoggerFactory))
                               .ConfigLoginValidator(loginValidator)
                               //.AddServiceProcessor(new ZipkinProcessor())
                               .AddServiceProcessor(new ServiceAuthorizeProcessor(serviceAuthorizer))
                               .UseDotNetty(serverConfig.ServerInfo)
                               .UseAutofac(container)
                               .Build();

            #endregion

            #region 配置监视

            IFileProvider fileProvider = new PhysicalFileProvider(dir);
            ChangeToken.OnChange(() => fileProvider.Watch(fileName), () =>
            {
                configRoot.Reload();
                serviceAuthorizer.LoadConfig(configRoot.GetDefaultServiceAuthorizeConfig());
                loginValidator.LoadConfig(configRoot.GetDefaultLoginValidatorConfig());
            });

            #endregion

            #region 启动

            System.Console.WriteLine("Please enter: 1-Start services and test, 2-Only start services.");
            var isTest = System.Console.ReadLine();

            nodeServer.StartAsync().Wait();

            try
            {
                serviceProxyManager.ConnectAsync().Wait();
            }
            catch (AggregateException ex)
            {
                foreach (var e in ex.InnerExceptions)
                {
                    if (e is NetworkException netEx)
                    {
                        System.Console.WriteLine($"Connect has net error. Host={netEx.Host}, Port={netEx.Port}, Message={netEx.Message}");
                    }
                    else
                    {
                        throw e;
                    }
                }
            }

            #endregion

            #region Test

            if (isTest == "1")
            {
                //new ZipkinBootstrapper(name)
                //    .ZipkinAt("192.168.87.131")
                //    .WithSampleRate(1.0)
                //    .Start();

                CallAddCustomer().Wait();
                CallGetCustomer();
                CallQueryCustomer().Wait();

                CallAddOrder().Wait();
                CallQueryOrder().Wait();

                CallGetOrders().Wait();

                CallRemoveCustomer();
                CallQueryCustomer().Wait();
                CallRemoveAllCustomer();
                CallQueryCustomer().Wait();

                CallSaveCustomerPhoto().Wait();
                CallGetCustomerPhoto().Wait();

                //Test();
            }
            else
            {
                //new ZipkinBootstrapper(name, System.Net.IPAddress.Parse(serverConfig.ServerInfo.Host), (short)serverConfig.ServerInfo.Port)
                //    .ZipkinAt("192.168.87.131")
                //    .WithSampleRate(1.0)
                //    .Start();
            }

            #endregion

            #region 关闭

            System.Console.ReadLine();

            nodeServer.StopAsync();

            serviceProxyManager.CloseAsync();

            #endregion

            System.Console.ReadLine();
        }
Пример #20
0
        private Task <CompilerCacheResult> CreateCacheEntry(
            string relativePath,
            string normalizedPath,
            Func <string, CompilationResult> compile)
        {
            TaskCompletionSource <CompilerCacheResult> compilationTaskSource = null;
            MemoryCacheEntryOptions cacheEntryOptions = null;
            IFileInfo fileInfo = null;
            Task <CompilerCacheResult> cacheEntry;

            // Safe races cannot be allowed when compiling Razor pages. To ensure only one compilation request succeeds
            // per file, we'll lock the creation of a cache entry. Creating the cache entry should be very quick. The
            // actual work for compiling files happens outside the critical section.
            lock (_cacheLock)
            {
                if (_cache.TryGetValue(normalizedPath, out cacheEntry))
                {
                    return(cacheEntry);
                }

                fileInfo = _fileProvider.GetFileInfo(normalizedPath);
                if (!fileInfo.Exists)
                {
                    IChangeToken expirationToken = _fileProvider.Watch(normalizedPath);
                    cacheEntry = Task.FromResult(new CompilerCacheResult(new[] { expirationToken }));

                    cacheEntryOptions = new MemoryCacheEntryOptions();
                    cacheEntryOptions.AddExpirationToken(expirationToken);
                }
                else
                {
                    cacheEntryOptions = GetMemoryCacheEntryOptions(normalizedPath);

                    // A file exists and needs to be compiled.
                    compilationTaskSource = new TaskCompletionSource <CompilerCacheResult>();
                    cacheEntry            = compilationTaskSource.Task;
                }

                cacheEntry = _cache.Set <Task <CompilerCacheResult> >(normalizedPath, cacheEntry, cacheEntryOptions);
            }

            if (compilationTaskSource != null)
            {
                // Indicates that the file was found and needs to be compiled.
                Debug.Assert(fileInfo != null && fileInfo.Exists);
                Debug.Assert(cacheEntryOptions != null);

                try
                {
                    CompilationResult compilationResult = compile(relativePath);
                    compilationResult.EnsureSuccessful();
                    compilationTaskSource.SetResult(
                        new CompilerCacheResult(relativePath, compilationResult, cacheEntryOptions.ExpirationTokens));
                }
                catch (Exception ex)
                {
                    compilationTaskSource.SetException(ex);
                }
            }

            return(cacheEntry);
        }
 /// <summary>
 /// 为指定的过滤器创建修改令牌。
 /// </summary>
 /// <param name="filter">给定的过滤器(如:**/*.cs, *.*, subFolder/**/*.cshtml.)。</param>
 /// <returns>返回 <see cref="IChangeToken"/>。</returns>
 public virtual IChangeToken Watch(string filter)
 => _provider.Watch(filter);
Пример #22
0
 public override IChangeToken Watch(string filter)
 {
     return(_provider.Watch(filter));
 }
Пример #23
0
        public static void Set <TItem>(this IDistributedCache cache, string key, byte[] value, FileCacheDependency dependency)
        {
            var fileInfo     = new FileInfo(dependency.FileName);
            var fileProvider = new PhysicalFileProvider(fileInfo.DirectoryName);

            cache.Set(key, value, new DistributedCacheEntryOptions2().AddExpirationToken(fileProvider.Watch(fileInfo.Name)));
        }
Пример #24
0
        public static void Main()
        {
            ICacheManager cacheManager = CreateCacheManager();
            var           greeting     = "";
            var           cacheKey     = "cache_key";
            var           fileProvider = new PhysicalFileProvider(Path.Combine(Directory.GetCurrentDirectory(), "WatchedFiles"));

            do
            {
                if (!cacheManager.TryGetValue(InMemoryStorePartition, cacheKey, out greeting))
                {
                    using (var streamReader = new StreamReader(fileProvider.GetFileInfo("example.txt").CreateReadStream()))
                    {
                        greeting = streamReader.ReadToEnd();
                        PostEvictionCallbackRegistration postEvictionCallbackRegistration = new PostEvictionCallbackRegistration
                        {
                            EvictionCallback = (echoKey, value, reason, substate) =>
                            {
                                Console.WriteLine($"{echoKey} : {value} was evicted due to {reason}");
                            }
                        };

                        cacheManager.Set(InMemoryStorePartition, cacheKey, new object(), fileProvider.Watch("example.txt"), postEvictionCallbackRegistration);

                        Console.WriteLine($"{cacheKey} updated from source.");
                    }
                }
                else
                {
                    Console.WriteLine($"{cacheKey} retrieved from cache.");
                }

                Console.WriteLine(greeting);
                Console.WriteLine("Press any key to continue. Press the ESC key to exit");
            }while (Console.ReadKey(true).Key != ConsoleKey.Escape);
        }
Пример #25
0
        public void Watch(string viewDirectory)
        {
            IFileProvider fileProvider = new PhysicalFileProvider(viewDirectory);

            ChangeToken.OnChange(() => fileProvider.Watch("**/*.cshtml"), () => LoadFileAsync(fileProvider));
        }