最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C#如何解析http報文

 更新時間:2015年08月04日 11:35:27   投稿:mrr  
這篇文章如果講解了用C#如何解析http報文,要解析http報文,需要哪些操作呢?下面小編給大家整理相關(guān)資料,需要的朋友可以參考下

下面通過一段內(nèi)容有文字說明有代碼分析,并附有展示圖供大家學習。

要解析HTTP報文,需要實現(xiàn)以下操作:

讀取HTTP報頭提供的各種屬性
分析屬性值,從中獲取內(nèi)容編碼和字符集編碼
將報頭數(shù)據(jù)和內(nèi)容進行分離
判斷內(nèi)容是否文本還是二進制,如果是二進制的則不進行處理
如果內(nèi)容是文本,按報頭中提供的內(nèi)容編碼和字符集編碼進行解壓縮和解碼
目前沒有找到.Net框架內(nèi)置的解析方法,理論上HttpClient等類在內(nèi)部應(yīng)該已經(jīng)實現(xiàn)了解析,但不知為何沒有公開這些處理方法。(亦或是我沒找到)

那么只能自己來解析這些數(shù)據(jù)了。

我們先來看看這個經(jīng)過gzip壓縮的文本內(nèi)容的HTTP報文:

這里提供一個老外寫的簡陋的解析類(已經(jīng)過修改,原代碼中存在一些嚴重BUG):

public enum HTTPHeaderField
{
 Accept = 0,
 Accept_Charset = 1,
 Accept_Encoding = 2,
 Accept_Language = 3,
 Accept_Ranges = 4,
 Authorization = 5,
 Cache_Control = 6,
 Connection = 7,
 Cookie = 8,
 Content_Length = 9,
 Content_Type = 10,
 Date = 11,
 Expect = 12,
 From = 13,
 Host = 14,
 If_Match = 15,
 If_Modified_Since = 16,
 If_None_Match = 17,
 If_Range = 18,
 If_Unmodified_Since = 19,
 Max_Forwards = 20,
 Pragma = 21,
 Proxy_Authorization = 22,
 Range = 23,
 Referer = 24,
 TE = 25,
 Upgrade = 26,
 User_Agent = 27,
 Via = 28,
 Warn = 29,
 Age = 30,
 Allow = 31,
 Content_Encoding = 32,
 Content_Language = 33,
 Content_Location = 34,
 Content_Disposition = 35,
 Content_MD5 = 36,
 Content_Range = 37,
 ETag = 38,
 Expires = 39,
 Last_Modified = 40,
 Location = 41,
 Proxy_Authenticate = 42,
 Refresh = 43,
 Retry_After = 44,
 Server = 45,
 Set_Cookie = 46,
 Trailer = 47,
 Transfer_Encoding = 48,
 Vary = 49,
 Warning = 50,
 WWW_Authenticate = 51
};
class HTTPHeader
{
 #region PROPERTIES
 private string[] m_StrHTTPField = new string[52];
 private byte[] m_byteData = new byte[4096];
 public string[] HTTPField
 {
  get { return m_StrHTTPField; }
  set { m_StrHTTPField = value; }
 }
 public byte[] Data
 {
  get { return m_byteData; }
  set { m_byteData = value; }
 }
 #endregion
 // convertion
 System.Text.ASCIIEncoding encoding = new System.Text.ASCIIEncoding();
 #region CONSTRUCTEUR
 /// <summary>
 /// Constructeur par défaut - non utilisé
 /// </summary>
 private HTTPHeader()
 { }
 public HTTPHeader(byte[] ByteHTTPRequest)
 {
  string HTTPRequest = encoding.GetString(ByteHTTPRequest);
  try
  {
   int IndexHeaderEnd;
   string Header;
   // Si la taille de requête est supérieur ou égale à 1460, alors toutes la chaine est l'entête http
   if (HTTPRequest.Length <= 1460)
    Header = HTTPRequest;
   else
   {
    IndexHeaderEnd = HTTPRequest.IndexOf("\r\n\r\n");
    Header = HTTPRequest.Substring(0, IndexHeaderEnd);
    Data = ByteHTTPRequest.Skip(IndexHeaderEnd + 4).ToArray();
   }
   HTTPHeaderParse(Header);
  }
  catch (Exception)
  { }
 }
 #endregion
 #region METHODES
 private void HTTPHeaderParse(string Header)
 {
  #region HTTP HEADER REQUEST & RESPONSE
  HTTPHeaderField HHField;
  string HTTPfield, buffer;
  int Index;
  foreach (int IndexHTTPfield in Enum.GetValues(typeof(HTTPHeaderField)))
  {
   HHField = (HTTPHeaderField)IndexHTTPfield;
   HTTPfield = "\n" + HHField.ToString().Replace('_', '-') + ": "; //Ajout de \n devant pour éviter les doublons entre cookie et set_cookie
   // Si le champ n'est pas présent dans la requête, on passe au champ suivant
   Index = Header.IndexOf(HTTPfield);
   if (Index == -1)
    continue;
   buffer = Header.Substring(Index + HTTPfield.Length);
   Index = buffer.IndexOf("\r\n");
   if (Index == -1)
    m_StrHTTPField[IndexHTTPfield] = buffer.Trim();
   else
    m_StrHTTPField[IndexHTTPfield] = buffer.Substring(0, Index).Trim();
   //Console.WriteLine("Index = " + IndexHTTPfield + " | champ = " + HTTPfield.Substring(1) + " " + m_StrHTTPField[IndexHTTPfield]);
  }
  // Affichage de tout les champs
  /*for (int j = 0; j < m_StrHTTPField.Length; j++)
  {
   HHField = (HTTPHeaderField)j;
   Console.WriteLine("m_StrHTTPField[" + j + "]; " + HHField + " = " + m_StrHTTPField[j]);
  }
  */
  #endregion
 }
 #endregion
}

編寫以下代碼以實現(xiàn)解析文件:

class Program
{
 static void Main(string[] args)
 {
  SRART: Console.WriteLine("輸入待解析的HTTP報文數(shù)據(jù)文件完整路徑:");
  var filename = Console.ReadLine();
  try
  {
   FileStream fs = new FileStream(filename, FileMode.Open);
   BinaryReader br = new BinaryReader(fs);
   var data = br.ReadBytes((int)fs.Length);
   var header = new HTTPHeader(data);
   var x = 0;
   foreach (var f in header.HTTPField)
   {
    if (!String.IsNullOrEmpty(f))
    {
     Console.WriteLine($"[{x:00}] - {(HTTPHeaderField) x} : {f}");
    }
    x++;
   }
   Console.WriteLine($"總數(shù)據(jù)尺寸{fs.Length}字節(jié),實際數(shù)據(jù)尺寸{header.Data.Length}字節(jié)");
   Console.WriteLine(Encoding.UTF8.GetString(header.Data));
   Console.WriteLine();
   br.Close();
   fs.Close();  
  }
  catch (Exception e)
  {
   Console.WriteLine(e);
  }
  goto SRART;
 }
}

這里還未實現(xiàn)gzip解壓縮和字符解碼,直接用UTF8解碼輸出的。(需要時再寫吧,都是體力活兒~)

效果圖展示:

下面的圖是沒有經(jīng)過gzip壓縮過的數(shù)據(jù)。

以上就是用C#如何解析http報文的全部內(nèi)容,哪位大俠還有好的方法歡迎提出寶貴意見,喜歡大家喜歡以上內(nèi)容所述。

相關(guān)文章

  • C#中Hashtable與Dictionary的用法對比及選擇

    C#中Hashtable與Dictionary的用法對比及選擇

    這篇文章主要介紹了C#中Hashtable與Dictionary的用法對比及選擇方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2025-03-03
  • C#編程實現(xiàn)簡易圖片瀏覽器的方法

    C#編程實現(xiàn)簡易圖片瀏覽器的方法

    這篇文章主要介紹了C#編程實現(xiàn)簡易圖片瀏覽器的方法,涉及C#基于WinForm操作圖片實現(xiàn)預(yù)覽功能的相關(guān)技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-11-11
  • C#創(chuàng)建自定義控件及添加自定義屬性和事件使用實例詳解

    C#創(chuàng)建自定義控件及添加自定義屬性和事件使用實例詳解

    這篇文章主要給大家介紹了關(guān)于C#創(chuàng)建自定義控件及添加自定義屬性和事件使用的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家學習或者使用C#具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧
    2020-05-05
  • Unity制作游戲自定義按鍵詳解

    Unity制作游戲自定義按鍵詳解

    這篇文章主要介紹了在Unity中如何實現(xiàn)游戲自定義按鍵,文中的示例代碼講解詳細,對我們學習Unity有一定幫助,感興趣的可以跟隨小編學習一下
    2022-01-01
  • C#中常用的運算符總結(jié)

    C#中常用的運算符總結(jié)

    在本篇文章里小編給大家分享了關(guān)于C#中常用的運算符的知識點總結(jié),需要的朋友們跟著學習下。
    2019-03-03
  • .net C# 實現(xiàn)任意List的笛卡爾乘積算法代碼

    .net C# 實現(xiàn)任意List的笛卡爾乘積算法代碼

    笛卡爾(Descartes)乘積又叫直積。假設(shè)集合A={a,b},集合B={0,1,2},則兩個集合的笛卡爾積為{(a,0),(a,1),(a,2),(b,0),(b,1), (b,2)}。
    2013-05-05
  • C#中File和FileStream的簡單介紹和用法

    C#中File和FileStream的簡單介紹和用法

    這篇文章主要給大家介紹了關(guān)于C#中File和FileStream用法的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-01-01
  • C# LINQ的基本使用方法示例

    C# LINQ的基本使用方法示例

    這篇文章主要給大家介紹了關(guān)于C# LINQ的基本使用教程,文中通過示例代碼介紹的非常詳細,對大家學習或者使用C# LINQ具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧
    2020-08-08
  • C#中將UTC時間轉(zhuǎn)換為JST時間的實現(xiàn)方法

    C#中將UTC時間轉(zhuǎn)換為JST時間的實現(xiàn)方法

    在C#中,將UTC時間轉(zhuǎn)換為JST(日本標準時間,即UTC+9)時間可以通過使用 DateTime 和 TimeZoneInfo 類來實現(xiàn),JST比UTC快9小時,因此可以直接進行轉(zhuǎn)換,本文將通過代碼示例給大家介紹C#中將UTC時間轉(zhuǎn)換為JST時間,需要的朋友可以參考下
    2025-01-01
  • C#實現(xiàn)DevExpress本地化實例詳解

    C#實現(xiàn)DevExpress本地化實例詳解

    這篇文章主要介紹了C#實現(xiàn)DevExpress本地化,以實例形式較為詳細的分析了DevExpress本地化的相關(guān)技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-08-08

最新評論

家居| 乐业县| 吴桥县| 湖口县| 突泉县| 阜新| 农安县| 申扎县| 松滋市| 宁陵县| 从化市| 壤塘县| 鞍山市| 杂多县| 丘北县| 宜丰县| 伊宁县| 罗甸县| 安达市| 木兰县| 土默特右旗| 清新县| 尚志市| 西安市| 兴山县| 逊克县| 邵阳市| 喀什市| 民权县| 常德市| 海门市| 五莲县| 威远县| 游戏| 龙岩市| 福海县| 古交市| 乌拉特后旗| 江口县| 突泉县| 旬邑县|