C/S架构系统的自动更新功能设计与实现(六)

自定义启动画面

需求

临近新中国成立70周年,项目团队计划发布一个以“70周年”为主题的版本。其中,能体现这一主题的,是系统的自动升级启动界面。该界面需要加载一张固定大小的图片。通过图片的修改和重新编译打包自动升级文件,来修改启动风格。
扩展一下这个需求,可以变成像很多常见的手机App或C/S客户端软件那样,动态加载启动画面。
这样的需求,该如何实现呢?其实不难。

原理

  • 做一个接口,提供下载最新启动画面图片的功能,部署到服务器上。
  • 客户端在加载时,首先从服务器上下载最新图片,下载不到时,使用本地或默认图片。
  • 正常执行后续的各种操作(更新、启动等)。

实现

服务器端图片加载的服务接口

/// <summary>
/// 获取启动界面图片
/// </summary>
/// <returns>图片文件流</returns>
/// <status>可用</status>
[HttpGet]
[ResponseType(typeof(ResponseInfo))]
public IHttpActionResult Startup()
{
	var response = new HttpResponseMessage(HttpStatusCode.OK);
	try
	{
		var sFolder = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Startup");
		if(!Directory.Exists(sFolder))
		{
			throw new Exception($"未能找到文件夹{sFolder}");
		}
		var lstFilePath = new List<string>();
		lstFilePath.AddRange(Directory.GetFiles(sFolder, "*.png", SearchOption.TopDirectoryOnly));
		lstFilePath.AddRange(Directory.GetFiles(sFolder, "*.jpg", SearchOption.TopDirectoryOnly));
		var lstFileInfo = new List<FileInfo>();
		lstFilePath.ForEach(p => lstFileInfo.Add(new FileInfo(p)));
		var fileInfoArray = lstFileInfo.ToArray();
		UpgradeHelper.SortByCreationTimeDesc(ref fileInfoArray);
		var sPath = fileInfoArray[0].FullName;
		if (!File.Exists(sPath))
		{
			throw new Exception($"未能找到文件{sPath}");
		}
		FileStream fileStream = new FileStream(sPath, FileMode.Open);
		response.Content = new StreamContent(fileStream);
		response.Content.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream");
		response.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment")
		{
			FileName = fileInfoArray[0].Name
		};
	}
	catch (Exception ex)
	{
		ExceptionHelper.LogActionException(ex);
		response.StatusCode = HttpStatusCode.NotFound;
		response.Content = null;
	}
	return ResponseMessage(response);
}

在接口网站的根目录下添加一个Startup文件夹,放入启动图片(可放置多张,按文件的创建时间,每次取最新的。支持jpg或png格式)。
取最新图片的方法为:

/// <summary>
/// 按文件的创建时间排序(倒序)
/// </summary>
/// <param name="dirs">待排序文件数组</param>
public static void SortByCreationTimeDesc(ref FileInfo[] dirs)
{
	Array.Sort(dirs, delegate (FileInfo x, FileInfo y) { return y.CreationTime.CompareTo(x.CreationTime); });
}

客户端加载最新启动图片的方法

/// <summary>
/// 设置启动图片
/// </summary>
private void SetStartupImage()
{
	try
	{
		//设置启动图片
		var sImageFilePath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "upgrade");
		Uri uri = null;
		try
		{
			var sServerIP = m_sValueServerIP;
			if (0 == string.Compare(sServerIP, "127.0.0.1", StringComparison.OrdinalIgnoreCase))
			{
				sServerIP = "localhost";
			}
			var nServerPort = m_nValueServerPort;
			var sUrl = $"http://{sServerIP}:{nServerPort}/api/Upgrade/Startup";
			var request = (HttpWebRequest)WebRequest.Create(sUrl);
			request.Method = "GET";
			var response = (HttpWebResponse)request.GetResponse();
			if (HttpStatusCode.OK == response.StatusCode)
			{
				if (File.Exists(sImageFilePath))
					File.Delete(sImageFilePath);
				using (var fileStream = File.Create(sImageFilePath))
				{
					using (var stream = response.GetResponseStream())
					{
						stream.CopyTo(fileStream);
						uri = new Uri(sImageFilePath);
					}
				}
			}
			if (response != null)
			{
				response.Close();
			}
			if (request != null)
			{
				request.Abort();
			}
		}
		catch (Exception e)
		{
			Console.WriteLine(e);
		}
		if (uri == null && File.Exists(sImageFilePath))
		{
			uri = new Uri(sImageFilePath, UriKind.Absolute);
		}
		if (uri != null)
		{
			startImage.Source = new BitmapImage(uri);
		}
	}
	catch (Exception e)
	{
		Console.WriteLine(e);
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值