26

在 .NET 中是否可以将原始 HTTP 请求转换为 HTTPWebRequest 对象?

我确定.NET 在内部这样做。知道 .NET 的哪个部分实际上正在处理这个问题吗?我可以调用它还是有任何外部库允许原始 HTTP 连接?

4

3 回答 3

10

我不相信有一种公开的方法可以做到这一点。您可能必须找到或编写一个解析器来分解请求,然后编写您自己的扩展 HttpWebRequest 的类。

下面是来自 CodeProject 的解析器:

http://www.codeproject.com/KB/IP/CSHTTPServer.aspx

我查看了 HttpWebRequest 的转子代码(简要地),我没有看到任何作为灵丹妙药的东西。这是文件的链接:

http://www.123aspx.com/Rotor/RotorSrc.aspx?rot=40844

所有转子代码都在这里供在线浏览:

http://www.123aspx.com/Rotor/default.aspx

在这里你可以下载它:

http://www.microsoft.com/downloads/details.aspx?FamilyId=8C09FD61-3F26-4555-AE17-3121B4F51D4D&displaylang=en

我知道一堆链接并不能真正回答您的问题,但我认为您正在寻找的功能并未在框架中公开。我很想被证明是错误的,所以如果你找到了一个好的方法,请更新帖子。我知道那里的工具必须这样做,任何用 .Net 编写的记录原始请求然后让您重新提交它们的东西都在做类似的事情。我相信提琴手( http://www.fiddler2.com ) 是用 .Net 编写的,您可能想向这些人发送电子邮件,看看他们是否可以提供帮助。

于 2009-02-10T05:10:05.343 回答
5

现在可以了,但仅限于 .Net Core 2.0+。使用Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http.HttpParser类:

using Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http;
using System;
using System.Buffers;
using System.Collections.Generic;
using System.Text;

public class Program : IHttpRequestLineHandler, IHttpHeadersHandler
{
    public static void Main(string[] args)
    {
        string requestString =
@"POST /resource/?query_id=0 HTTP/1.1
Host: example.com
User-Agent: custom
Accept: */*
Connection: close
Content-Length: 20
Content-Type: application/json

{""key1"":1, ""key2"":2}";
        byte[] requestRaw = Encoding.UTF8.GetBytes(requestString);
        ReadOnlySequence<byte> buffer = new ReadOnlySequence<byte>(requestRaw);
        HttpParser<Program> parser = new HttpParser<Program>();
        Program app = new Program();
        Console.WriteLine("Start line:");
        parser.ParseRequestLine(app, buffer, out var consumed, out var examined);
        buffer = buffer.Slice(consumed);
        Console.WriteLine("Headers:");
        parser.ParseHeaders(app, buffer, out consumed, out examined, out var b);
        buffer = buffer.Slice(consumed);
        string body = Encoding.UTF8.GetString(buffer.ToArray());
        Dictionary<string, int> bodyObject = Newtonsoft.Json.JsonConvert.DeserializeObject<Dictionary<string, int>>(body);
        Console.WriteLine("Body:");
        foreach (var item in bodyObject)
            Console.WriteLine($"key: {item.Key}, value: {item.Value}");
        Console.ReadKey();
    }

    public void OnHeader(Span<byte> name, Span<byte> value)
    {
        Console.WriteLine($"{Encoding.UTF8.GetString(name)}: {Encoding.UTF8.GetString(value)}");
    }

    public void OnStartLine(HttpMethod method, HttpVersion version, Span<byte> target, Span<byte> path, Span<byte> query, Span<byte> customMethod, bool pathEncoded)
    {
        Console.WriteLine($"method: {method}");
        Console.WriteLine($"version: {version}");
        Console.WriteLine($"target: {Encoding.UTF8.GetString(target)}");
        Console.WriteLine($"path: {Encoding.UTF8.GetString(path)}");
        Console.WriteLine($"query: {Encoding.UTF8.GetString(query)}");
        Console.WriteLine($"customMethod: {Encoding.UTF8.GetString(customMethod)}");
        Console.WriteLine($"pathEncoded: {pathEncoded}");
    }
}

输出:

Start line:
method: Post
version: Http11
target: /resource/?query_id=0
path: /resource/
query: ?query_id=0
customMethod:
pathEncoded: False
Headers:
Host: example.com
User-Agent: custom
Accept: */*
Connection: close
Content-Length: 20
Content-Type: application/json
Body:
key: key1, value: 1
key: key2, value: 2
于 2019-01-07T13:49:44.750 回答
0

Google for Cassinni,它是一个 HTTP 服务器,其源代码最初由 Microsoft 提供,可以托管 ASP.NET 调用。您必须自己解析请求并加载它,但 Cassinni 将是一个很好的起点。此 URL 可能会有所帮助:

http://blogs.msdn.com/dmitryr/archive/2005/09/27/474534.aspx

于 2009-04-06T21:55:47.110 回答