ASP.NET Core:从内部启动对应用程序的请求

时间:2018-03-09 11:31:55

标签: asp.net-core .net-core asp.net-core-2.0

在ASP.NET Core 2.0项目中,我正在尝试向服务器本身发起新请求。由于Kestrel是一个托管的Web服务器,我认为这应该很容易,但我找不到答案。

当您需要其他操作的结果来生成结果(可能是多个操作)时,这尤其有用,但您希望为每个操作运行整个管道。 (例如,记录,授权或路由)

不,我不认为这是一个XY问题,我会编辑澄清,并在最后提供用例。

我想要实现的是避免网络层,否则HttpClient是可行的方法,而且很容易。但是,如果我与网络进行交互,除了开销之外,我还需要知道服务器的托管URL和端口,这会让它变得难看。

我将通过一个例子详细说明:我已经使用了这样的模式来进行Web服务器的进程内托管(主要用于单元测试)

var server = TestServer.Create(appBuilder =>
{
    var startup = new TestStartup();
    startup.Configuration(appBuilder);
});

var client = server.HttpClient;
// Use the client to send requests

此测试服务器允许在不对网络进行任何绑定的情况下处理内存中的流。我希望使用Kestrel获得类似的结果。或者,如果可能,构造一个Request对象并传递一个引用,以供Web主机和管道处理。

我可以想到一些用例:

  • 将多个请求批处理(通过请求正文)并避免传输延迟
  • 在某些特定于操作的逻辑之后延迟运行路由,其中​​解释服务器期望的最佳和最简单的关键是URL本身
  • 服务器端重定向(过去Server.Transfer)的影响

我知道安全风险和气味,但在某些情况下,这可能是一个很好的解决方案。具体来说,我的情况是批处理加上对访问受限且只执行只读操作的小监控存根的结果的一些计算,因此没有风险。

1 个答案:

答案 0 :(得分:0)

使用正确的客户端上下文可靠再次运行整个管道的唯一方法是通过客户端往返,通常使用Redirect返回类型。

如果有一种方法可以完全在服务器端发起新请求,这将有效地使您的服务器成为新客户端,并且它必须做非常不安全的事情来模仿"客户端。你基本上都在谈论对你自己的中间人攻击。

(我不同意SamiAI90的答案,因为你没有特别询问API,还有很多其他可能的场景与API式访问,不记名令牌等无关。 )