如何在 .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&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();
}
我有一个处理字节流的项目,其中一些是 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&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();
}