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

时间:2018-06-21 14:30:42

标签: c# .net httprequest .net-standard-2.0

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

我尝试使用 HttpRequestMessage HttpResponseMessage ,但是在.NetCore API中,我们没有这些类。在这种情况下,对于HttpRequest和HttpResponse来说,最好使用哪种类?

示例:

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;
    }
}

4 个答案:

答案 0 :(得分:1)

没有通用的基类可以使用。即使您创建自己的接口或包装器,这些属性也会具有不同的名称,不同的类型以及一些以前称为可写现在仅可读(并设置了另一种方式)。

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

答案 1 :(得分:1)

您为什么需要处理HttpResponseMessage中的IOcspResponder类型?

您只能在Controller中将类型用作HttpResponseMessageHttpResponse,然后使用序列化处理定义数据结构中的请求/响应数据。

然后,Controller的方法不必处理HTTP特定的库,而是可以在IOcspResponder定义中定义和使用的数据结构。

查看this answer以获得有关此设置的更多详细信息。

查看this answer,了解有关序列化的更多详细信息和示例。

答案 2 :(得分:1)

我解决了这一问题,创建了 OcspHttpRequest OcspHttpResponse 类。之后,我创建了扩展方法,可以轻松地将这些类转换为.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;
}

答案 3 :(得分:0)

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

var request = WebRequest.Create(YOUR_URL);

它返回派生出System.Net.WebRequest的所列类型的实例:

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

取决于从给定URL指定的协议。您可以调用其GetResponseAsyncGetResponse方法来获得System.Net.WebResponse,该方法也可以通过以下方式得出:

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

一种替代方法是使用System.Net.Http.HttpClient。它与您提到的System.Net.Http.HttpRequestMessageSystem.Net.Http.HttpResponseMessage一起使用。根据{{​​3}},它肯定在.NET Core API中,甚至从official API document起。

Microsoft已将其文档从.NET Core 1.0移至MSDN,并且docs.microsoft.com.NET Core都仅在此站点上。