如何在 .net 中解析原始 HTTP 响应?

How can I parse a raw HTTP response in .net?

我有一个处理字节流的项目,其中一些是 HTTP 响应。我需要从该字节流中解析原始 HTTP 响应。

我自己可以做到这一点,但必须已经存在执行此操作的代码,所以我开始查看 Kestrel,但我看不到任何方法来完成我正在尝试的事情。也许这对我的需求来说太过分了。

如何在 .net 中解析原始 HTTP 响应?

这是一个解码为 ASCII 的示例:

HTTP/1.1 200 OK
Content-Type: text/html
Last-Modified: Sun, 17 Apr 2022 03:32:06 GMT
Accept-Ranges: bytes
ETag: "374b9ab6b52d81:0"
Server: Microsoft-IIS/10.0
X-Powered-By: ASP.NET
Date: Wed, 27 Apr 2022 10:45:49 GMT
Content-Length: 696

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>IIS Windows</title>
<style type="text/css">
<!--
body {
    color:#000000;
    background-color:#0072C6;
    margin:0;
}

#container {
    margin-left:auto;
    margin-right:auto;
    text-align:center;
    }

a img {
    border:none;
}

-->
</style>
</head>
<body>
<div id="container">
<a href="http://go.microsoft.com/fwlink/?linkid=66138&amp;clcid=0x409"><img src="iisstart.png" alt="IIS" width="960" height="600" /></a>
</div>
</body>
</html>

HttpWebResponse 实现 ISerializable。

因此您可以简单地使用 BinaryFormatter 反序列化您的字节流

var formatter = new BinaryFormatter();
var webResponse = (HttpWebResponse)formatter.Deserialize(sourceByteStream);

我最终使用了这个 Nuget 包:

https://www.nuget.org/packages/HttpMachine.PCL/4.0.3

using (var handler = new HttpParserDelegate())
using (var parser = new HttpCombinedParser(handler))
{
    bArray = TestReponse();
    Console.WriteLine(parser.Execute(bArray) == bArray.Length
        ? $"Reponse test succeed. Type identified is; {handler.HttpRequestResponse.MessageType} \r\n" +
            $"Headers: \r\n" +
            $"{string.Join("\r\n", handler.HttpRequestResponse.Headers.Select(h => $"{h.Key}: {string.Join(", ", h.Value)} "))}"
        : $"Response test failed");

    handler.HttpRequestResponse.Body.Position = 0;
    var reader = new StreamReader(handler.HttpRequestResponse.Body);
    var body = reader.ReadToEnd();
}