// 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); }
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); } }
/// <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); } }
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(); } }
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(); } }
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!"); }
/// <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); }
public void GetFileProvider() { var fp = new PhysicalFileProvider(TempPath); fp.Watch("*.*"); }
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"); }
public IChangeToken Watch(string filter) => _provider.Watch(filter.ToLower());
private static void WatchForFileChanges() { var fileChangeToken = _FileProvider.Watch("*.*"); fileChangeToken.RegisterChangeCallback(Notify, default); }
public IChangeToken Watch(string filter) { return(_physicalFileProvider.Watch(filter)); }
/// <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)); }
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); }
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(); } } }
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); }
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(); }
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);
public override IChangeToken Watch(string filter) { return(_provider.Watch(filter)); }
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))); }
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); }
public void Watch(string viewDirectory) { IFileProvider fileProvider = new PhysicalFileProvider(viewDirectory); ChangeToken.OnChange(() => fileProvider.Watch("**/*.cshtml"), () => LoadFileAsync(fileProvider)); }