ASP.NET Web API 應用教程(一) ——數據流使用

?

?

相信已經有很多文章來介紹ASP.Net Web API 技術,本系列文章主要介紹如何使用數據流,HTTPS,以及可擴展的Web API 方面的技術,系列文章主要有三篇內容。

主要內容如下:

I ?數據流

II 使用HTTPS

III 可擴展的Web API 文檔

?

項目環境要求

  • VS 2012(SP4)及以上,
  • .Net 框架4.5.1
  • Nuget包,可在packages.config 文件中查尋

本文涉及的知識點

  1. ActionFilter
  2. AuthorizationFilter
  3. DelegateHandler
  4. Different Web API routing 屬性
  5. MediaTypeFormatter
  6. OWIN
  7. Self Hosting
  8. Web API 文檔及可擴展功能

.Net 框架

  1. Async/Await
  2. .NET reflection
  3. Serialization
  4. ASP.NET Web API/MVC Error handling
  5. IIS ,HTTPS 及Certificate
  6. 設計準則及技術

前言

?

自從ASP.NET MVC 4之后.Net 框架開始支持ASP.NET Web API ,ASP.NET Web API 基于HTTP 協議建立的,是構建 RESTful 服務和處理數據的理想平臺,旨在使用HTTP 技術實現對多平臺的支持。

ASP.NET Web API 以request-response 的消息轉換模式為主,客戶端向服務器發送請求,服務器端響應客戶端請求。響應可同步或異步。

?個人認為使用Web API創建應用需要注意的三個關鍵點:

  • 采用服務及方法滿足的目標
  • 每個方法的輸入,如請求
  • 每個方法的輸出,如響應

通常情況下,Asp.Net Web API 定義method語法與HTTP方法一一對應的,如自定義方法名?GetPysicians(),則與HTTP中Get 方法匹配。下圖是常用匹配表。

?


但是此方法在很多情況下,并不實用,假如你想在單個API controller 類中定義多個Get 或Post 方法,在這種情況下,需要定義包含action 的路徑,將Action 作為URI 的一部分。以下是配置代碼:

   1:  public static void Register(HttpConfiguration config)
   2:  {
   3:      // Web API configuration and services
   4:      // Web API routes
   5:       config.MapHttpAttributeRoutes();
   6:      
   7:       config.Routes.MapHttpRoute(name: "PhysicianApi",
   8:                  routeTemplate: "{controller}/{action}/{id}",
   9:                  defaults: new { id = RouteParameter.Optional });
  10:  }

但是此方法不足以應對所有情況,如果想實現從中央倉庫刪除文件,并且想調用同一個方法來獲取文件,這種情況下,Web API 框架需要偽裝Get 及Delete對應的HTTP 方法屬性。如圖所示:

RemoveFile 方法可被Delete(HttpDelete) 或 Get(HttpGet)方法同時調用,從某種程度來說,HTTP 方法使開發人員命名?API“方法”變得簡單而標準。

Web API框架也提供了一些其他功能來處理路徑方面的問題,與MVC 的路徑處理方法相似。因此可定義不同類型的Action方法。?

數據流

網絡App 最常見的執行操作就是獲取數據流。ASP.NET Web API 能夠處理客戶端與服務器端傳輸的重量級的數據流,數據流可來源于目錄文件,也可是數據庫中的二進制文件。本文主要介紹兩種方法“Download”和“Upload”實現數據流相關的功能,Download是從服務器下載數據操作,而Upload則是上傳數據到服務器。

相關項目

  • WebAPIDataStreaming
  • WebAPIClient
  • POCOLibrary

在對代碼解釋之前,首先來了解如何配置IIS(7.5)和Web API 服務Web.Config 文件。

1. 保證Downloads/Uploads 涉及的文件具有讀寫權限。

2. 保證有足夠容量的內容或因公安空間處理大文件。

3. 如果文件較大

a. 配置Web.Config 文件時,保證 maxRequestLength 時響應時間 executionTimeout 合理。具體的值主要依賴于數據大小,允許一次性上傳的最大數據為2 GB

b. 保證 maxAllowedContentLength 在requestFiltering部分配置下正確設置,默認值為30MB,最大值4GB

一旦完成預先配置,那么創建數據流服務就非常簡單了,首先 需要定義文件流“ApiController”,如下:

   1:  /// <summary>
   2:  /// File streaming API
   3:  /// </summary>
   4:  [RoutePrefix("filestreaming")]
   5:  [RequestModelValidator]
   6:  public class StreamFilesController : ApiController
   7:  {
   8:      /// <summary>
   9:      /// Get File meta data
  10:      /// </summary>
  11:      /// <param name="fileName">FileName value</param>
  12:      /// <returns>FileMeta data response.</returns>
  13:      [Route("getfilemetadata")]
  14:      public HttpResponseMessage GetFileMetaData(string fileName)
  15:      {
  16:          // .........................................
  17:          // Full code available in the source control
  18:          // .........................................
  19:  ?
  20:      }
  21:  ?
  22:      /// <summary>
  23:      /// Search file and return its meta data in all download directories
  24:      /// </summary>
  25:      /// <param name="fileName">FileName value</param>
  26:      /// <returns>List of file meta datas response</returns>
  27:      [HttpGet]
  28:      [Route("searchfileindownloaddirectory")]
  29:      public HttpResponseMessage SearchFileInDownloadDirectory(string fileName)
  30:      {
  31:          // .........................................
  32:          // Full code available in the source control
  33:          // .........................................
  34:      }
  35:  ?
  36:      /// <summary>
  37:      /// Asynchronous Download file
  38:      /// </summary>
  39:      /// <param name="fileName">FileName value</param>
  40:      /// <returns>Tasked File stream response</returns>
  41:      [Route("downloadasync")]
  42:      [HttpGet]
  43:      public async Task<HttpResponseMessage> DownloadFileAsync(string fileName)
  44:      {
  45:          // .........................................
  46:          // Full code available in the source control
  47:          // .........................................
  48:      }
  49:  ?
  50:      /// <summary>
  51:      /// Download file
  52:      /// </summary>
  53:      /// <param name="fileName">FileName value</param>
  54:      /// <returns>File stream response</returns>
  55:      [Route("download")]
  56:      [HttpGet]
  57:      public HttpResponseMessage DownloadFile(string fileName)
  58:      {
  59:          // .........................................
  60:          // Full code available in the source control
  61:          // .........................................
  62:      }
  63:  ?
  64:      /// <summary>
  65:      /// Upload file(s)
  66:      /// </summary>
  67:      /// <param name="overWrite">An indicator to overwrite a file if it exist in the server</param>
  68:      /// <returns>Message response</returns>
  69:      [Route("upload")]
  70:      [HttpPost]
  71:      public HttpResponseMessage UploadFile(bool overWrite)
  72:      {
  73:          // .........................................
  74:          // Full code available in the source control
  75:          // .........................................
  76:      }
  77:  ?
  78:      /// <summary>
  79:      /// Asynchronous Upload file
  80:      /// </summary>
  81:      /// <param name="overWrite">An indicator to overwrite a file if it exist in the server</param>
  82:      /// <returns>Tasked Message response</returns>
  83:      [Route("uploadasync")]
  84:      [HttpPost]
  85:      public async Task<HttpResponseMessage> UploadFileAsync(bool overWrite)
  86:      {
  87:          // .........................................
  88:          // Full code available in the source control
  89:          // .........................................
  90:      }
  91:  }

Download 服務方法首先需要確認請求的文件是否存在,如果未找到,則返回錯誤提示“file is not found”,如果找到此文件,內容則轉換為字節附加到響應對象,為“application/octet-stream” MIMI 內容類型。

   1:  /// <summary>
   2:  /// Download file
   3:  /// </summary>
   4:  /// <param name="fileName">FileName value<param>
   5:  /// <returns>File stream response<returns>
   6:  [Route("download")]
   7:  [HttpGet]
   8:  public HttpResponseMessage DownloadFile(string fileName)
   9:  {
  10:      HttpResponseMessage response = Request.CreateResponse();
  11:      FileMetaData metaData = new FileMetaData();
  12:      try
  13:      {
  14:          string filePath = Path.Combine(this.GetDownloadPath(), @"\", fileName);
  15:          FileInfo fileInfo = new FileInfo(filePath);
  16:  ?
  17:          if (!fileInfo.Exists)
  18:          {
  19:              metaData.FileResponseMessage.IsExists = false;
  20:              metaData.FileResponseMessage.Content = string.Format("{0} file is not found !", fileName);
  21:              response = Request.CreateResponse(HttpStatusCode.NotFound, metaData, new MediaTypeHeaderValue("text/json"));
  22:          }
  23:          else
  24:          {
  25:              response.Headers.AcceptRanges.Add("bytes");
  26:              response.StatusCode = HttpStatusCode.OK;
  27:              response.Content = new StreamContent(fileInfo.ReadStream());
  28:              response.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment");
  29:              response.Content.Headers.ContentDisposition.FileName = fileName;
  30:              response.Content.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream");
  31:              response.Content.Headers.ContentLength = fileInfo.Length;
  32:          }
  33:      }
  34:      catch (Exception exception)
  35:      {
  36:          // Log exception and return gracefully
  37:          metaData = new FileMetaData();
  38:          metaData.FileResponseMessage.Content = ProcessException(exception);
  39:          response = Request.CreateResponse(HttpStatusCode.InternalServerError, metaData, new MediaTypeHeaderValue("text/json"));
  40:      }
  41:      return response;
  42:  }

Upload服務方法則會在multipart/form-data MIMI 內容類型執行,首先會檢測HTTP 請求的內容類型是否是多主體,如果是,則對比內容長度是否超過最大尺寸,如果沒有超過,則開始上傳內容,當操作完成之后,則提示相應的信息。

代碼片段如下:

   1:  /// <summary>
   2:  /// Upload file(s)
   3:  /// </summary>
   4:  /// <param name="overWrite">An indicator to overwrite a file if it exist in the server.</param>
   5:  /// <returns>Message response</returns>
   6:  [Route("upload")]
   7:  [HttpPost]
   8:  public HttpResponseMessage UploadFile(bool overWrite)
   9:  {
  10:      HttpResponseMessage response = Request.CreateResponse();
  11:      List<FileResponseMessage> fileResponseMessages = new List<FileResponseMessage>();
  12:      FileResponseMessage fileResponseMessage = new FileResponseMessage { IsExists = false };
  13:  ?
  14:      try
  15:      {
  16:          if (!Request.Content.IsMimeMultipartContent())
  17:          {
  18:              fileResponseMessage.Content = "Upload data request is not valid !";
  19:              fileResponseMessages.Add(fileResponseMessage);
  20:              response = Request.CreateResponse(HttpStatusCode.UnsupportedMediaType, fileResponseMessages, new MediaTypeHeaderValue("text/json"));
  21:          }
  22:  ?
  23:          else
  24:          {
  25:              response = ProcessUploadRequest(overWrite);
  26:          }
  27:      }
  28:      catch (Exception exception)
  29:      {
  30:          // Log exception and return gracefully
  31:          fileResponseMessage = new FileResponseMessage { IsExists = false };
  32:          fileResponseMessage.Content = ProcessException(exception);
  33:          fileResponseMessages.Add(fileResponseMessage);
  34:          response = Request.CreateResponse(HttpStatusCode.InternalServerError, fileResponseMessages, new MediaTypeHeaderValue("text/json"));
  35:  ?
  36:      }
  37:      return response;
  38:  }
  39:  ?
  40:  /// <summary>
  41:  /// Asynchronous Upload file
  42:  /// </summary>
  43:  /// <param name="overWrite">An indicator to overwrite a file if it exist in the server.<param>
  44:  /// <returns>Tasked Message response</returns>
  45:  [Route("uploadasync")]
  46:  [HttpPost]
  47:  public async Task<HttpResponseMessage> UploadFileAsync(bool overWrite)
  48:  {
  49:      return await new TaskFactory().StartNew(
  50:         () =>
  51:         {
  52:             return UploadFile(overWrite);
  53:         });
  54:  }
  55:  ?
  56:  /// <summary>
  57:  /// Process upload request in the server
  58:  /// </summary> 
  59:  /// <param name="overWrite">An indicator to overwrite a file if it exist in the server.</param>
  60:  /// </returns>List of message object</returns>
  61:  private HttpResponseMessage ProcessUploadRequest(bool overWrite)
  62:  {
  63:      // .........................................
  64:      // Full code available in the source control
  65:      // .........................................
  66:  }

調用download 及 upload 文件方法是控制臺應用,App 假定文件流服務通過HttpClient和相關類。基本下載文件代碼,創建下載HTTP 請求對象。

   1:  /// <summary>
   2:  /// Download file
   3:  /// </summary>
   4:  /// <returns>Awaitable Task object</returns>
   5:  private static async Task DownloadFile()
   6:  {
   7:      Console.ForegroundColor = ConsoleColor.Green;
   8:      Console.WriteLine("Please specify file name  with extension and Press Enter :- ");
   9:      string fileName = Console.ReadLine();
  10:      string localDownloadPath = string.Concat(@"c:\", fileName); // the path can be configurable
  11:      bool overWrite = true;
  12:      string actionURL = string.Concat("downloadasync?fileName=", fileName);
  13:  ?
  14:      try
  15:      {
  16:          Console.WriteLine(string.Format("Start downloading @ {0}, {1} time ",
  17:              DateTime.Now.ToLongDateString(),
  18:              DateTime.Now.ToLongTimeString()));
  19:  ?
  20:  ?
  21:          using (HttpClient httpClient = new HttpClient())
  22:          {
  23:              httpClient.BaseAddress = baseStreamingURL;
  24:              HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Get, actionURL);
  25:  ?
  26:              await httpClient.SendAsync(request, HttpCompletionOption.ResponseHeadersRead).
  27:                  ContinueWith((response)
  28:                      =>
  29:                  {
  30:                      Console.WriteLine();
  31:                      try
  32:                      {
  33:                          ProcessDownloadResponse(localDownloadPath, overWrite, response);
  34:                      }
  35:                      catch (AggregateException aggregateException)
  36:                      {
  37:                          Console.ForegroundColor = ConsoleColor.Red;
  38:                          Console.WriteLine(string.Format("Exception : ", aggregateException));
  39:                      }
  40:                  });
  41:          }
  42:      }
  43:      catch (Exception ex)
  44:      {
  45:          Console.ForegroundColor = ConsoleColor.Red;
  46:          Console.WriteLine(ex.Message);
  47:      }
  48:  }
  49:  ?
  50:  ?
  51:  /// <summary>
  52:  /// Process download response object
  53:  /// </summary>
  54:  /// <param name="localDownloadFilePath">Local download file path</param>
  55:  /// <param name="overWrite">An indicator to overwrite a file if it exist in the client.</param>
  56:  /// <param name="response">Awaitable HttpResponseMessage task value</param>
  57:  private static void ProcessDownloadResponse(string localDownloadFilePath, bool overWrite,
  58:      Task<HttpResponseMessage> response)
  59:  {
  60:      if (response.Result.IsSuccessStatusCode)
  61:      {
  62:          response.Result.Content.DownloadFile(localDownloadFilePath, overWrite).
  63:              ContinueWith((downloadmessage)
  64:                  =>
  65:              {
  66:                  Console.ForegroundColor = ConsoleColor.Green;
  67:                  Console.WriteLine(downloadmessage.TryResult());
  68:              });
  69:      }
  70:      else
  71:      {
  72:          ProcessFailResponse(response);
  73:      }
  74:  }

?

注意上述代碼中HttpClient 對象發送請求,并等待響應發送Header內容(HttpCompletionOption.ResponseHeadersRead )。而不是發送全部的響應內容文件。一旦Response header 被讀,則執行驗證,一旦驗證成功,則執行下載方法。

以下代碼調用upload 文件流,與下載方法類似,創建多主體表單數據,并發送給服務器端。

   1:  /// <summary>
   2:  /// Upload file
   3:  /// </summary>
   4:  /// <returns>Awaitable task object</returns>
   5:  private static async Task UploadFile()
   6:  {
   7:      try
   8:      {
   9:          string uploadRequestURI = "uploadasync?overWrite=true";
  10:  ?
  11:          MultipartFormDataContent formDataContent = new MultipartFormDataContent();
  12:  ?
  13:          // Validate the file and add to MultipartFormDataContent object
  14:          formDataContent.AddUploadFile(@"c:\nophoto.png");
  15:          formDataContent.AddUploadFile(@"c:\ReadMe.txt");
  16:  ?
  17:          if (!formDataContent.HasContent()) // No files found to be uploaded
  18:          {
  19:              Console.ForegroundColor = ConsoleColor.Red;
  20:              Console.Write(formDataContent.GetUploadFileErrorMesage());
  21:              return;
  22:          }
  23:          else
  24:          {
  25:              string uploadErrorMessage = formDataContent.GetUploadFileErrorMesage();
  26:              if (!string.IsNullOrWhiteSpace(uploadErrorMessage)) // Some files couldn't be found
  27:              {
  28:                  Console.ForegroundColor = ConsoleColor.Red;
  29:                  Console.Write(uploadErrorMessage);
  30:              }
  31:  ?
  32:              HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Post, uploadRequestURI);
  33:              request.Content = formDataContent;
  34:  ?
  35:              using (HttpClient httpClient = new HttpClient())
  36:              {
  37:                  Console.ForegroundColor = ConsoleColor.Green;
  38:                  Console.WriteLine(string.Format("Start uploading @ {0}, {1} time ",
  39:                  DateTime.Now.ToLongDateString(),
  40:                  DateTime.Now.ToLongTimeString()));
  41:  ?
  42:                  httpClient.BaseAddress = baseStreamingURL;
  43:                  await httpClient.SendAsync(request).
  44:                        ContinueWith((response)
  45:                            =>
  46:                            {
  47:                                try
  48:                                {
  49:                                    ProcessUploadResponse(response);
  50:                                }
  51:                                catch (AggregateException aggregateException)
  52:                                {
  53:                                    Console.ForegroundColor = ConsoleColor.Red;
  54:                                    Console.WriteLine(string.Format("Exception : ", aggregateException));
  55:                                }
  56:                            });
  57:              }
  58:          }
  59:      }
  60:      catch (Exception ex)
  61:      {
  62:          Console.ForegroundColor = ConsoleColor.Red;
  63:          Console.WriteLine(ex.Message);
  64:      }
  65:  } 
  66:  ?
  67:  /// <summary>
  68:  /// Process download response object
  69:  /// </summary>
  70:  /// <param name="response">Awaitable HttpResponseMessage task value</param>
  71:  private static void ProcessUploadResponse(Task<HttpResponseMessage> response)
  72:  {
  73:      if (response.Result.IsSuccessStatusCode)
  74:      {
  75:          string uploadMessage = string.Format("\nUpload completed @ {0}, {1} time ",
  76:                      DateTime.Now.ToLongDateString(),
  77:                      DateTime.Now.ToLongTimeString());
  78:          Console.ForegroundColor = ConsoleColor.Green;
  79:          Console.WriteLine(string.Format("{0}\nUpload Message : \n{1}", uploadMessage,
  80:              JsonConvert.SerializeObject(response.Result.Content.ReadAsAsync<List<FileResponseMessage>>().TryResult(), Formatting.Indented)));
  81:      }
  82:      else
  83:      {
  84:          ProcessFailResponse(response);
  85:      }
  86:  }

?

數據流項目由可擴展類和方法組成,本文就不再詳述。下篇文章中將介紹“使用HTTPS 開發項目”

數據流是數據傳輸中的重要部分,學習了本節內容有助于大家更好地進行ASP.NET的開發。當然,還可以借助一些開發工具來助力開發過程。ComponentOne Studio for ASP.NET?提供了一整套完備的開發工具包,用于在各種瀏覽器中創建和設計具有現代風格的Web應用程序。

?

下載源代碼

原文鏈接:http://www.codeproject.com/Articles/838274/Web-API-Thoughts-of-Data-Streaming#Hist

?



原文鏈接:http://www.cnblogs.com/powertoolsteam/p/5029475.html

轉載于:https://www.cnblogs.com/Percy_Lee/p/5662424.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/256841.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/256841.shtml
英文地址,請注明出處:http://en.pswp.cn/news/256841.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

JAVA類的構造方法

1,構造方法沒有返回類型, 定義: []public] 方法名() {} 2,一個構造方法如果想調用同一類中的另一個構造方法,只能調用一個,并且要放在構造方法第一行 3,用this調用,如 1 public person(int i, int j) { 2 this(); //調用另一個構造方法,且放在第一行 3 } 轉載于:https://www…

將字符串和數字合并動態寫入

sprintf(tmpTime, "/media/AIlog/%02d_%02d_%.txt",100,200);

windows安裝64位Pygame方法

因為官方網站http://www.pygame.org/download.shtml并沒有提供64位的pygame&#xff0c;所以要找其他網站制作的64位安裝文件。 如果你已經在你的64位開發環境中安裝了32位的pygame&#xff0c; 那么在導入pygame包的時候&#xff0c; 會有提示&#xff1a; ImportError: DLL l…

學習筆記(48):Python實戰編程-grid布局

立即學習:https://edu.csdn.net/course/play/19711/343110?utm_sourceblogtoedu grid布局&#xff1a;根據表結構進行的布局&#xff0c;索引為0行0列開始&#xff0c;最具代表性的即使電腦計算器的數字和符號按鍵布局 組件.grid(row 行索引號 &#xff0c; column 列索引號…

為什么“三次握手,四次揮手”?

前言&#xff1a; 如果你說你懂IT,你懂計算機網絡&#xff0c;那么你會怎么解釋“三次握手&#xff0c;四次揮手”&#xff1f; ---------------- 1.TCP報文段首部格式&#xff1a; 2.TCP建立連接圖 -------------------------------------------- 符號說明 seq:"sequance…

學習筆記(49):Python實戰編程-place布局

立即學習:https://edu.csdn.net/course/play/19711/343111?utm_sourceblogtoedu 1.place布局&#xff1a; 1&#xff09;最靈活的布局方式&#xff0c;是根據坐標點來進行組件的位置布局的 2&#xff09;確定坐標點后&#xff0c;組件從坐標點開始展開&#xff0c;即以指定…

cobbler基礎安裝

epel源安裝rpm -ivh epel-release-6-8.noarch.rpmyum -y install cobbler httpd rsync tftp-server xinetd dhcp cobbler-web koan pykickstart* fence-agents* debmirror syslinux$$$$$$$$$$$啟動cobbler服務/etc/init.d/cobblerd start$$$$$$$$啟動httpd服務/etc/init.d/http…

[ActionScript 3.0] NetConnection建立客戶端與服務器的雙向連接

一個客戶端與服務器之間的接口測試的工具 <?xml version"1.0" encoding"utf-8"?> <!--- - - - - - - - - - - - - - - - - - - - - - - - - * author:Frost.Yen * E-mail:871979853qq.com * create:2016-7-13上午12:10:20 - - - - - - - - - - …

C++ share_prt 簡單設計和實現

C 比較煩惱的是內存的管理&#xff0c;new是簡單&#xff0c;不夠&#xff0c;delete偶爾就會忘記。或者說&#xff0c;出現&#xff0c;多個對象共享多一個內存&#xff0c;一個delete以后&#xff0c;導致其他也不能用的不良情況&#xff0c;所以就跑出了一個智能指針來進行管…

PID控制無人機

1、有效的辦法就是&#xff0c;根據距離目標值的遠近來調節云臺的速度&#xff0c;離得遠就轉快一些&#xff0c;離得近就慢一些。這樣就需要我們實時獲取云臺當前的實際角度&#xff0c;然后和目標角度做對比&#xff0c;根據差值來動態地調整云臺的速度和方向。 2、根據無人…

學習筆記(50):Python實戰編程-Frame

立即學習:https://edu.csdn.net/course/play/19711/343112?utm_sourceblogtoedu 1.Frame:是內嵌布局管理器&#xff0c;針對不同功能的組件進行區域劃分&#xff0c;在各自的區域內可以使用不同的布局&#xff0c;但是總的frame布局方式還是一致的 2.以計算器為例 步驟&#…

SVN使用MySQL驗證用戶名密碼(HTTP)

安裝過程全部采用yum 1yum -y install subversion httpd mod_auth_mysql mod_dav_svn mod_ssl 使用MySQL驗證是依賴于mod_auth_mysql 主要配置文件 12345678910111213141516171819202122<Location /svn > DAV svn SVNParentPath /var/www/html/svn AuthType Basic AuthNa…

Cent OS 6.4安裝mysql

Cent OS6.4 RPM安裝mysql 一、卸載掉原有mysql 因為目前主流Linux系統版本基本上都集成了mysql數據庫在里面 如下命令來查看我們的操作系統上是否已經安裝了mysql數據庫 [rootxiaoluo ~]# rpm -qa | grep mysql  // 這個命令就會查看該操作系統上是否已經安裝了mysql數據庫 有…

學習筆記(51):Python實戰編程-ListBox

立即學習:https://edu.csdn.net/course/play/19711/343113?utm_sourceblogtoedu listbox 知識點&#xff1a; 1)創建listbox: self.item_listbox tkinter.Listbox(self.root,selectmode "multiple", font("微軟雅黑",12),fg "black",bg &…

C++簡單工廠模式

核心思想&#xff1a;用一個工廠類根據不同的輸入條件new出不同的派生類指針&#xff0c;然后由多態調用不同派生類中virtual函數&#xff0c;得到不同的結果 所有的判斷處理在工廠類中完成&#xff0c;通過CreateFactory函數&#xff0c;根據不同的類型&#xff0c;new出派生類…

Saltstack的pillar組件(6)

pillar也是Saltstack最重要的組件之一&#xff0c;其作用是定義與被控主機相關的任何數據&#xff0c;定義好的數據可以被其他組件使用&#xff0c;如模板、state、API等。在pillar中定義的數據與不同業務特性的minion相關聯&#xff0c;這樣不同的minion只能看到自己匹配的數據…

redis投票計數

<?php /*** * 緩存利用測試&#xff0c;這里我們獲取傳過來的投票數據&#xff0c;每次加1&#xff0c;如果增加到了設定值&#xff0c;才將投票* 次數寫回mysql&#xff0c;這大大減輕了與mysql鏈接的開銷&#xff0c;redis的使用由此可見一斑* var unknown_type* 來自&am…

在linux系統中安裝VSCode(Visual Studio Code)

1.從官網下載壓縮包(話說下載下來解壓就直接可以運行了咧,都不需要make) 訪問Visual Studio Code官網 https://code.visualstudio.com/docs?dvlinux64 我是64位的: wget https://az764295.vo.msecnd.net/stable/7ba55c5860b152d999dda59393ca3ebeb1b5c85f/code-stable-code…

學習筆記(52):Python實戰編程-Radiobutton

立即學習:https://edu.csdn.net/course/play/19711/343115?utm_sourceblogtoedu 單選鈕&#xff1a;Radiobutton 1&#xff09;相對于大部分組件而言&#xff0c;最大的區別在于單選鈕綁定事件是直接通過構建單選鈕時方法中的command參數來進行事件的綁定&#xff0c;而其他的…

Linux文本查看命令之touch

touch可以用來創建文件或者修改文件的時間戳如果touch的文件不存在&#xff0c;就創建改文件touch命令可以修改文件的Access time和 Modify time-a 可以僅修改Access time注意&#xff1a;由于Access time的改變&#xff0c;Change time也改變了&#xff0c;但是如果cat該文件&…