在 .netstandard 2 中使用哪个 HttpRequest class?

Which HttpRequest class to use in .netstandard 2?

我在 .netstandard 库中工作,因为它应该在 .NetFramework 4.7 和 .NetCore 中工作。在那个库中,我有一个接收 HttpRequest 对象的方法,使用查询字符串、内容、内容类型等和 returns 一个 HttpResponse 处理请求。

我尝试使用 HttpRequestMessageHttpResponseMessage,但在 .NetCore API 中,我们没有这些classes。在这种情况下,HttpRequest 和 HttpResponse 哪个最好class?

示例:

public interface IOcspResponder
{
    Task<HttpResponseMessage> Respond(HttpRequestMessage httpRequest);
}

客户端将实现控制器并按以下方式使用库:

[RoutePrefix("api/ocsp")]
public class OcspController : Controller
{
    [Route("{encoded}"]
    public Task<HttpResponseMessage> Get(string encoded)
    {
        return await OcspResponder.Respond(Request);
    }

    [Route("")]
    public Task<HttpResponseMessage> Post()
    {
        return await OcspResponder.Respond(Request);
    }

    private IOcspResponder OcspResponder { get; }

    public OcspController(IOcspResponder ocspResponder)
    {
        OcspResponder = ocspResponder;
    }
}

没有可以使用的通用基础 class。即使您创建自己的接口或包装器,这些属性也有不同的名称、不同的类型和一些曾经是例如可写现在只能读(并设置另一种方式)。

遗憾的是,您将不得不创建两个单独的代码库来完成相同的工作。

为什么您需要处理 HttpResponseMessage 输入 IOcspResponder

您只能在控制器中使用 HttpResponseMessageHttpResponse 类型,然后使用序列化处理您定义的数据结构中的 request/response 数据。

然后,您的控制器的方法将不必处理 HTTP 特定库,但可以在 IOcspResponder 定义中定义和使用的数据结构。

查看 this answer 了解有关此设置的更多详细信息。

查看 以获取有关序列化的更多详细信息和示例。

System.Net.WebRequest符合您的要求吗?

var request = WebRequest.Create(YOUR_URL);

它 returns 派生的所列类型的实例 System.Net.WebRequest:

System.Net.FileWebRequest System.Net.FtpWebRequest System.Net.HttpWebRequest

取决于给定 url 指定的协议。你可以调用它的 GetResponseAsync or GetResponse method to get a System.Net.WebResponse ,它也是由以下派生的:

System.Net.FileWebResponse System.Net.FtpWebResponse System.Net.HttpWebResponse

另一种方法是使用 System.Net.Http.HttpClient. It works with System.Net.Http.HttpRequestMessage and System.Net.Http.HttpResponseMessage that you have mentioned. According to the official API document, it is surely in .NET Core API even from .NET Core 1.0

Microsoft 已将其文档从 MSDN to docs.microsoft.com and the .NET Core and .NET Standard 内容仅在该站点上移动。

我通过创建 类 OcspHttpRequestOcspHttpResponse 解决了这个问题。在此之后,我创建了扩展方法来轻松地将那些 类 转换为 .NET Framework 和 .NET Core 的原生 类。

.NET Framework 示例:

public static async Task<OcspHttpRequest> ToOcspHttpRequest(this HttpRequestMessage requestMessage)
{
    var httpRequestBase = new OcspHttpRequest
    {
       HttpMethod = requestMessage.Method.Method,
       MediaType = requestMessage.Content.Headers.ContentType.MediaType,
       RequestUri = requestMessage.RequestUri,
       Content = await requestMessage.Content.ReadAsByteArrayAsync()
     };

     return httpRequestBase;
 }

.NET Core 示例:

public static async Task<OcspHttpRequest> ToOcspHttpRequest(this HttpRequest request)
{
    var ocspHttpRequest = new OcspHttpRequest();
    ocspHttpRequest.HttpMethod = request.Method;
    ocspHttpRequest.MediaType = request.ContentType;
    ocspHttpRequest.RequestUri = request.GetUri();
    ocspHttpRequest.Content = await request.GetRawBodyBytesAsync();

    return ocspHttpRequest;
}