我正在使用 .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;
}
}
答案 0 :(得分:1)
没有通用的基类可以使用。即使您创建自己的接口或包装器,这些属性也会具有不同的名称,不同的类型以及一些以前称为可写现在仅可读(并设置了另一种方式)。
不幸的是,您将不得不创建两个单独的代码库来完成相同的工作。
答案 1 :(得分:1)
您为什么需要处理HttpResponseMessage
中的IOcspResponder
类型?
您只能在Controller中将类型用作HttpResponseMessage
或HttpResponse
,然后使用序列化处理定义数据结构中的请求/响应数据。
然后,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指定的协议。您可以调用其GetResponseAsync
或GetResponse
方法来获得System.Net.WebResponse
,该方法也可以通过以下方式得出:
System.Net.FileWebResponse
System.Net.FtpWebResponse
System.Net.HttpWebResponse
一种替代方法是使用System.Net.Http.HttpClient
。它与您提到的System.Net.Http.HttpRequestMessage
和System.Net.Http.HttpResponseMessage
一起使用。根据{{3}},它肯定在.NET Core API中,甚至从official API document起。
Microsoft已将其文档从.NET Core 1.0移至MSDN,并且docs.microsoft.com和.NET Core都仅在此站点上。