为了体验.net在linux上运行,因此使用HttpClient东借西抄作了一个简单的api上传功能。html
第一步,简单的上传功能:linux
public class UploadHelper { private static readonly string controller = "/api/Upload"; /// <summary> /// 使用HttpClient上传附件 /// </summary> /// <param name="filePath"></param> /// <returns></returns> public static async Task<string> Upload(string filePath) { FileStream fileStream = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.Read); HttpContent httpContent = new StreamContent(fileStream); httpContent.Headers.ContentType = MediaTypeHeaderValue.Parse("multipart/form-data"); string filename = filePath.Substring(filePath.LastIndexOf("\\") + 2); NameValueCollection nameValueCollection = new NameValueCollection(); nameValueCollection.Add("user-agent", "User-Agent Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; Touch; MALNJS; rv:11.0) like Gecko"); using (MultipartFormDataContent mulContent = new MultipartFormDataContent("----WebKitFormBoundaryrXRBKlhEeCbfHIY")) { mulContent.Add(httpContent, "file", filename); string ip = ConfigurationProvider.configuration.GetSection("webapi:HttpAddresss").Value; string url = "http://"+ip + controller; return await HttpHelper.PostHttpClient(url, nameValueCollection, mulContent); } } } public class HttpHelper { /// <summary> /// httpclient post请求 /// </summary> /// <param name="url"></param> /// <param name="RequestHeaders"></param> /// <param name="multipartFormDataContent"></param> /// <returns></returns> public static async Task<string> PostHttpClient(string url, NameValueCollection RequestHeaders, MultipartFormDataContent multipartFormDataContent) { var handler = new HttpClientHandler(); handler.ServerCertificateCustomValidationCallback = delegate { return true; }; using (HttpClient client = new HttpClient(handler)) { client.MaxResponseContentBufferSize = 256000; client.DefaultRequestHeaders.Add(RequestHeaders.Keys[0],RequestHeaders[RequestHeaders.Keys[0]]); HttpResponseMessage httpResponseMessage = await client.PostAsync(url, multipartFormDataContent); httpResponseMessage.EnsureSuccessStatusCode(); string result = httpResponseMessage.Content.ReadAsStringAsync().Result; return result; } } }
而后本身再写一个api程序作为服务端用来接收请求,以下代码:nginx
[Route("api/[controller]")] [ApiController] public class UploadController : ControllerBase { private IHostingEnvironment hostingEnvironment; public UploadController(IHostingEnvironment _hostingEnvironment) { hostingEnvironment = _hostingEnvironment; } [HttpPost] public IActionResult Upload() { try { var imgFile = Request.Form.Files[0]; int index = imgFile.FileName.LastIndexOf('.'); //获取后缀名 string extension = imgFile.FileName.Substring(index, imgFile.FileName.Length - index); string webpath = hostingEnvironment.ContentRootPath; string guid = Guid.NewGuid().ToString().Replace("-", ""); string newFileName = guid + extension; DateTime dateTime = DateTime.Now; //linux环境目录为/{1}/ string path = string.Format(@"{0}/TemporaryFile/{1}/{2}/{3}", "/home/www", dateTime.Year.ToString(), dateTime.Month.ToString() , dateTime.Day.ToString()); if (!Directory.Exists(path)) Directory.CreateDirectory(path); string imgSrc = path + @"/" + newFileName; using (FileStream fs = System.IO.File.Create(imgSrc)) { imgFile.CopyTo(fs); fs.Flush(); } return new JsonResult(new { message = "OK", code = 200 }); } catch (Exception e) { return new JsonResult(new {message=e.Message,code=500}); } }
api程序记得修改Program.csweb
public class Program { public static void Main(string[] args) { CreateWebHostBuilder(args).Build().Run(); } //本地启动 //public static IWebHostBuilder CreateWebHostBuilder(string[] args) => // WebHost.CreateDefaultBuilder(args).UseUrls("http://*:5000") // .UseStartup<Startup>(); //linux启动 public static IWebHostBuilder CreateWebHostBuilder(string[] args) => WebHost.CreateDefaultBuilder(args) .UseStartup<Startup>(); }
当时我访问出现502就是由于这个缘由api
而后本地测试能够以后再将api部署到linux服务器,部署linux须要一下工具:浏览器
XFTP:将发布好的api程序传到linux,服务器
Ngnix:反向代理,参考菜鸟教程https://www.runoob.com/linux/nginx-install-setup.html,个人配置是这个,记得将5000加入防火墙,而且网络策略这个端口:网络
user www www; worker_processes 2; #设置值和CPU核心数一致 error_log /usr/local/webserver/nginx/logs/nginx_error.log crit; #日志位置和日志级别 pid /usr/local/webserver/nginx/nginx.pid; #Specifies the value for maximum file descriptors that can be opened by this process. worker_rlimit_nofile 65535; events { use epoll; worker_connections 65535; } http { #下面是server虚拟主机的配置 server { listen 80; location / { proxy_pass http://localhost:5000; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection keep-alive; proxy_set_header Host $host; proxy_cache_bypass $http_upgrade; } } }
具体的部署过程网上不少教程。部署好以后就能够试着用postman或浏览器输入地址访问了。async
由于linux的机制当你退出linux后就没法访问,因此须要配置进程守护,个人配置以下ide
[program:BlogApi] command=dotnet BlogApi.dll directory=/home/wwwroot/BlogAPI/ stderr_logfile=/var/log/BlogApi.error.log stdout_logfile=/var/log/BlogApi.stdout.log environment=ASPNETCORE_ENVIRONMENT=Production user=root stopsignal=INT autostart=true autorestart=true startsecs=3
更新重启守护进程,而后你就能够随时随地访问了,