■ WebClient 클래스를 사용해 넥서스 저장소(Nexus Repository)에서 파일 업로드/삭제/목록을 구하는 방법을 보여준다.
▶ TimeoutWebClient.cs
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 |
using System; using System.Net; namespace TestProject { /// <summary> /// 타임아웃 웹 클라이언트 /// </summary> public class TimeoutWebClient : WebClient { //////////////////////////////////////////////////////////////////////////////////////////////////// Field ////////////////////////////////////////////////////////////////////////////////////////// Private #region Field /// <summary> /// 타임아웃 (단위 : 밀리초) /// </summary> private int timeout = 0; #endregion //////////////////////////////////////////////////////////////////////////////////////////////////// Constructor ////////////////////////////////////////////////////////////////////////////////////////// Public #region 생성자 - TimeoutWebClient(timeout) /// <summary> /// 생성자 /// </summary> /// <param name="timeout">타임아웃</param> public TimeoutWebClient(int timeout) { this.timeout = timeout * 1000; } #endregion //////////////////////////////////////////////////////////////////////////////////////////////////// Method ////////////////////////////////////////////////////////////////////////////////////////// Protected #region 웹 요청 구하기 - GetWebRequest(uri) /// <summary> /// 웹 요청 구하기 /// </summary> /// <param name="uri">URI</param> /// <returns>웹 요청</returns> protected override WebRequest GetWebRequest(Uri uri) { WebRequest request = base.GetWebRequest(uri); request.Timeout = timeout; return request; } #endregion } } |
▶ Checksum.cs
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 |
using Newtonsoft.Json; namespace TestProject { /// <summary> /// 체크썸 /// </summary> public class Checksum { //////////////////////////////////////////////////////////////////////////////////////////////////// Property ////////////////////////////////////////////////////////////////////////////////////////// Public #region MD5 - MD5 /// <summary> /// MD5 /// </summary> [JsonProperty("md5")] public string MD5 { get; set; } #endregion #region SHA1 - SHA1 /// <summary> /// SHA1 /// </summary> [JsonProperty("sha1")] public string SHA1 { get; set; } #endregion #region SHA256 - SHA256 /// <summary> /// SHA256 /// </summary> [JsonProperty("sha256")] public string SHA256 { get; set; } #endregion #region SHA512 - SHA512 /// <summary> /// SHA512 /// </summary> [JsonProperty("sha512")] public string SHA512 { get; set; } #endregion } } |
▶ Item.cs
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 |
using Newtonsoft.Json; namespace TestProject { /// <summary> /// 항목 /// </summary> public class Item { //////////////////////////////////////////////////////////////////////////////////////////////////// Property ////////////////////////////////////////////////////////////////////////////////////////// Public #region ID - ID /// <summary> /// ID /// </summary> [JsonProperty("id")] public string ID { get; set; } #endregion #region 저장소 - Repository /// <summary> /// 저장소 /// </summary> [JsonProperty("repository")] public string Repository { get; set; } #endregion #region 경로 - Path /// <summary> /// 경로 /// </summary> [JsonProperty("path")] public string Path { get; set; } #endregion #region 포맷 - Format /// <summary> /// 포맷 /// </summary> [JsonProperty("format")] public string Format { get; set; } #endregion #region 다운로드 URL - DownloadURL /// <summary> /// 다운로드 URL /// </summary> [JsonProperty("downloadUrl")] public string DownloadURL { get; set; } #endregion #region 체크썸 - Checksum /// <summary> /// 체크썸 /// </summary> [JsonProperty("checksum")] public Checksum Checksum { get; set; } #endregion } } |
▶ AssetData.cs
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
using System.Collections.Generic; using Newtonsoft.Json; namespace TestProject { /// <summary> /// 자산 데이터 /// </summary> public class AssetData { //////////////////////////////////////////////////////////////////////////////////////////////////// Property ////////////////////////////////////////////////////////////////////////////////////////// Public #region 항목 리스트 - ItemList /// <summary> /// 항목 리스트 /// </summary> [JsonProperty("items")] public IList<Item> ItemList { get; set; } #endregion #region 연속 토큰 - ContinuationToken /// <summary> /// 연속 토큰 /// </summary> [JsonProperty("continuationToken")] public string ContinuationToken { get; set; } #endregion } } |
▶ NexusHelper.cs
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 |
using System.Collections.Generic; using System.Net; using Newtonsoft.Json; namespace TestProject { /// <summary> /// 넥서스 헬퍼 /// </summary> public static class NexusHelper { //////////////////////////////////////////////////////////////////////////////////////////////////// Field ////////////////////////////////////////////////////////////////////////////////////////// Static //////////////////////////////////////////////////////////////////////////////// Private #region Field /// <summary> /// 항목 리스트 구하기 URL 포맷 1 /// </summary> private static readonly string _getItemListURLFormat1 = "{0}/service/rest/v1/assets?repository={1}"; /// <summary> /// 항목 리스트 구하기 URL 포맷 2 /// </summary> private static readonly string _getItemListURLFormat2 = "{0}/service/rest/v1/assets?repository={1}&continuationToken={2}"; #endregion //////////////////////////////////////////////////////////////////////////////////////////////////// Property ////////////////////////////////////////////////////////////////////////////////////////// Static //////////////////////////////////////////////////////////////////////////////// Public #region 사용자 ID - UserID /// <summary> /// 사용자 ID /// </summary> public static string UserID { get; set; } #endregion #region 패스워드 - Password /// <summary> /// 패스워드 /// </summary> public static string Password { get; set; } #endregion //////////////////////////////////////////////////////////////////////////////////////////////////// Method ////////////////////////////////////////////////////////////////////////////////////////// Static //////////////////////////////////////////////////////////////////////////////// Public #region 파일 업로드하기 - UploadFile(sourceFilePath, targetURL) /// <summary> /// 파일 업로드하기 /// </summary> /// <param name="sourceFilePath">소스 파일 경로</param> /// <param name="targetURL">타겟 URL</param> /// <remarks> /// sourceFilePath : @"d:\test.txt" /// targetURL : "http://nexus.dscore.com/repository/arca/upload/test.txt" /// </remarks> public static void UploadFile(string sourceFilePath, string targetURL) { using(WebClient client = new TimeoutWebClient(600)) { client.Credentials = new NetworkCredential(UserID, Password); client.UploadFile(targetURL, "PUT", sourceFilePath); } } #endregion #region 파일 삭제하기 - DeleteFile(targetURL) /// <summary> /// 파일 삭제하기 /// </summary> /// <param name="targetURL">타겟 URL</param> /// <remarks> /// targetURL : "http://nexus.dscore.com/repository/arca/upload/test.txt" /// </remarks> public static void DeleteFile(string targetURL) { using(WebClient client = new TimeoutWebClient(5)) { client.Credentials = new NetworkCredential(UserID, Password); client.UploadData(targetURL, "DELETE", new byte[] { 1 }); } } #endregion #region 항목 리스트 구하기 - GetItemList(serverURL, repositoryName) /// <summary> /// 항목 리스트 구하기 /// </summary> /// <param name="serverURL">서버 URL</param> /// <param name="repositoryName">저장소명</param> /// <returns>항목 리스트</returns> public static List<Item> GetItemList(string serverURL, string repositoryName) { using(WebClient client = new TimeoutWebClient(10)) { client.Credentials = new NetworkCredential(UserID, Password); List<Item> list = new List<Item>(); string url = string.Format(_getItemListURLFormat1, serverURL, repositoryName); while(true) { string json = client.DownloadString(url); AssetData data = JsonConvert.DeserializeObject<AssetData>(json); foreach(Item item in data.ItemList) { list.Add(item); } if(string.IsNullOrEmpty(data.ContinuationToken)) { break; } else { url = string.Format(_getItemListURLFormat2, serverURL, repositoryName, data.ContinuationToken); } } return list; } } #endregion } } |
▶ Program.cs
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
using System; using System.Collections.Generic; namespace TestProject { /// <summary> /// 프로그램 /// </summary> class Program { //////////////////////////////////////////////////////////////////////////////////////////////////// Method ////////////////////////////////////////////////////////////////////////////////////////// Static //////////////////////////////////////////////////////////////////////////////// Private #region 프로그램 시작하기 - Main() /// <summary> /// 프로그램 시작하기 /// </summary> private static void Main() { NexusHelper.UserID = "userID"; NexusHelper.Password = "password"; List<Item> itemList = NexusHelper.GetItemList("http://nexus.dscore.com", "arca-repository"); foreach(Item item in itemList) { Console.WriteLine($"{item.ID} : {item.Path}"); } } #endregion } } |