【问题标题】:Parse a raw HTTP Response in C# to get the Status Code在 C# 中解析原始 HTTP 响应以获取状态码
【发布时间】:2011-10-10 09:27:33
【问题描述】:

有没有一种简单的方法来解析一个 HTTP 响应字符串,如下所示:

"HTTP/1.1 200 OK\r\nContent-Length: 1433\r\nContent-Type: text/html\r\nContent-Location: http://server/iisstart.htm\r\nLast-Modified: Fri, 21 Feb 2003 23:48:30 GMT\r\nAccept-Ranges: bytes\r\nETag: \"09b60bc3dac21:1ca9\"\r\nServer: Microsoft-IIS/6.0\r\nX-Po"

我想获取状态码。我不一定需要将其转换为HttpResponse 对象,但这也是可以接受的,并且只需解析状态代码即可。我能否将其解析为 HttpStatusCode 枚举?

我正在使用基于套接字的方法,并且无法更改我获得响应的方式。我只会使用这个字符串。

【问题讨论】:

标签: c# http sockets httpresponse


【解决方案1】:

编辑考虑到“我正在使用基于套接字的方法,并且无法更改我获得响应的方式。我只会使用此字符串”。

怎么样

  string response = "HTTP/1.1 200 OK\r\nContent-Length: 1433\r\nContent-Type: text/html\r\nContent-Location: http://server/iisstart.htm\r\nLast-Modified: Fri, 21 Feb 2003 23:48:30 GMT\r\nAccept-Ranges: bytes\r\nETag: \"09b60bc3dac21:1ca9\"\r\nServer: Microsoft-IIS/6.0\r\nX-Po";

  string code = response.Split(' ')[1];
  // int code = int.Parse(response.Split(' ')[1]);

我最初是这样建议的:

  HttpWebRequest webRequest =(HttpWebRequest)WebRequest.Create("http://www.gooogle.com/");
  webRequest.AllowAutoRedirect = false;
  HttpWebResponse response = (HttpWebResponse)webRequest.GetResponse();
  int statuscode = (int)response.StatusCode)

【讨论】:

  • 我不确定这应该如何正确运行,因为每个名称/值对由 \r\n 分隔,而不是 " ".... \r\n 然后按空格分割每个以获得真实的名称/值...
  • @tecknik 因为他试图获取出现在第一个字符串之后的响应代码。如果你想将整个事情拆分成键值对,你可以这样做,但他只是想把代码拿出来,在这种情况下是“200”。
  • @TechnikEmpire 第一行的结构不像 http 标头中的哈希表。尽管后续行是结构化的并且可以在“:”(冒号)处拆分以获取键/值对以进一步解析标题。
  • @devprashant 我的意思是,在编写了一个完全兼容的 HTTP/S 代理之后,这是一种非常糟糕的解析标头的方法。事实上,这根本不解析标题,它会将它们拆分为一种会暴露状态代码字符串的方式,但绝对会破坏其他所有内容。
【解决方案2】:

HTTP 是一个非常简单的协议,以下应该可以相当可靠地输出状态代码(更新为更健壮一点):

int statusCodeStart = httpString.IndexOf(' ') + 1;
int statusCodeEnd = httpString.IndexOf(' ', statusCodeStart);

return httpString.Substring(statusCodeStart, statusCodeEnd - statusCodeStart);

如果你真的想要,你可以添加一个健全性检查来确保字符串以“HTTP”开头,但是如果你想要健壮性,你也可以只实现一个 HTTP 解析器。

老实说,这可能会做到! :-)

httpString.Substring(9, 3);

【讨论】:

    【解决方案3】:

    如果它只是一个字符串,你能不能只使用正则表达式来提取状态码?

    【讨论】:

    • 同意,根据 OP“我只会使用这个字符串。” ...所以使用字符串....
    【解决方案4】:

    要么按照 DD59 的建议去做,要么使用正则表达式。

    【讨论】:

      【解决方案5】:

      这会更新标记的答案以处理一些极端情况:

          static HttpStatusCode? GetStatusCode(string response)
          {
              string rawCode = response.Split(' ').Skip(1).FirstOrDefault();
      
              if (!string.IsNullOrWhiteSpace(rawCode) && rawCode.Length > 2)
              {
                  rawCode = rawCode.Substring(0, 3);
      
                  int code;
      
                  if (int.TryParse(rawCode, out code))
                  {
                      return (HttpStatusCode)code;
                  }
              }
      
              return null;
          }
      

      【讨论】:

        【解决方案6】:

        因为状态码的格式保持不变,你可能可以像这样使用 smthing。

        var responseArray = Regex.Split(response, "\r\n");
         if(responseArray.Length)>0
         {
         var statusCode = (int)responseArray[0].split(' ')[1];
         }
        

        【讨论】:

          猜你喜欢
          • 2012-02-13
          • 1970-01-01
          • 2020-10-04
          • 2022-01-18
          • 2021-03-15
          • 1970-01-01
          • 2012-10-23
          • 2021-01-28
          • 1970-01-01
          相关资源
          最近更新 更多