public void Dispose() => _factory.CleanAllHttpData();
static async Task Main(string[] args) { var builder = new UriBuilder { Scheme = ClientSettings.IsSsl ? "https" : "http", Host = ClientSettings.Host.ToString(), Port = ClientSettings.Port, }; var baseUri = builder.Uri.ToString(); ExampleHelper.SetConsoleLogger(); string postSimple, postFile, get; if (baseUri.EndsWith("/")) { postSimple = baseUri + "formpost"; postFile = baseUri + "formpostmultipart"; get = baseUri + "formget"; } else { postSimple = baseUri + "/formpost"; postFile = baseUri + "/formpostmultipart"; get = baseUri + "/formget"; } var uriSimple = new Uri(postSimple); var uriFile = new Uri(postFile); bool useLibuv = ClientSettings.UseLibuv; Console.WriteLine("Transport type : " + (useLibuv ? "Libuv" : "Socket")); IEventLoopGroup group; if (useLibuv) { group = new EventLoopGroup(); } else { group = new MultithreadEventLoopGroup(); } X509Certificate2 cert = null; string targetHost = null; if (ClientSettings.IsSsl) { cert = new X509Certificate2(Path.Combine(ExampleHelper.ProcessDirectory, "dotnetty.com.pfx"), "password"); targetHost = cert.GetNameInfo(X509NameType.DnsName, false); } try { var bootstrap = new Bootstrap(); bootstrap .Group(group) .Option(ChannelOption.TcpNodelay, true); if (useLibuv) { bootstrap.Channel <TcpChannel>(); } else { bootstrap.Channel <TcpSocketChannel>(); } bootstrap.Handler(new ActionChannelInitializer <IChannel>(channel => { IChannelPipeline pipeline = channel.Pipeline; if (cert != null) { pipeline.AddLast("tls", new TlsHandler(stream => new SslStream(stream, true, (sender, certificate, chain, errors) => true), new ClientTlsSettings(targetHost))); } //pipeline.AddLast(new LoggingHandler("CONN")); pipeline.AddLast("codec", new HttpClientCodec()); // Remove the following line if you don't want automatic content decompression. pipeline.AddLast("inflater", new HttpContentDecompressor()); // to be used since huge file transfer pipeline.AddLast("chunkedWriter", new ChunkedWriteHandler <IHttpContent>()); pipeline.AddLast("handler", new HttpUploadClientHandler()); })); // setup the factory: here using a mixed memory/disk based on size threshold var factory = new DefaultHttpDataFactory(DefaultHttpDataFactory.MinSize); // Disk if MINSIZE exceed DiskFileUpload.DeleteOnExitTemporaryFile = true; // should delete file on exit (in normal exit) DiskFileUpload.FileBaseDirectory = null; // system temp directory DiskAttribute.DeleteOnExitTemporaryFile = true; // should delete file on exit (in normal exit) DiskAttribute.DiskBaseDirectory = null; // system temp directory // Simple Get form: no factory used (not usable) var headers = await FormgetAsync(bootstrap, get, uriSimple); if (headers == null) { factory.CleanAllHttpData(); return; } using (var file = new FileStream("upload.txt", FileMode.Open, FileAccess.Read)) { // Simple Post form: factory used for big attributes var bodylist = await FormpostAsync(bootstrap, uriSimple, file, factory, headers); if (bodylist == null) { factory.CleanAllHttpData(); return; } // Multipart Post form: factory used await FormpostmultipartAsync(bootstrap, uriFile, factory, headers, bodylist); } Console.WriteLine("按任意键退出"); Console.ReadKey(); } finally { await group.ShutdownGracefullyAsync(TimeSpan.FromMilliseconds(100), TimeSpan.FromSeconds(1)); } }