gpt4 book ai didi

asp.net-core - 以编程方式调用 ASP.NET Core 请求管道

转载 作者:行者123 更新时间:2023-12-03 23:16:09 25 4
gpt4 key购买 nike

问题

鉴于我有一个 HTTP 动词、路由、 header 和正文有效负载,有没有办法从我自己的应用程序中以编程方式调用 ASP.NET Core 请求管道?

背景

在某些用例中,我们的 ASP.NET Core 应用程序的 WebAPI 无法访问,因为应用程序在防火墙后面运行或无法访问。

为了为这种情况提供解决方案,我们希望我们的应用程序轮询一些其他服务以获取“工作项”,然后将其转换为我们应用程序中的 API 调用。

我考虑的方法

  • 我可能只是要求 DI 给我一个 Controller 的实例,然后在其上调用方法。这种方法的问题:
  • 不强制执行授权属性。但在我们的用例中,验证不记名 token 很重要。所以这里的问题是:如何以编程方式调用授权中间件?
  • 我必须自己将传入的工作项路由到正确的 Controller /方法。
  • 使用 Microsoft.AspNetCore.TestHost我可以创建一个 TestClient 的包这让我可以向自己提出请求(见 here )。但这里有几个不确定性:
  • TestHost 的预期用例用于集成测试。在生产环境中使用它是否安全?
  • 有没有可能有这样的TestServer与常规托管一起运行?
  • 那么线程安全呢?我可以创建多个 TestClients来自单个 TestServer实例并从不同的线程中使用它们?

  • 因此,我确信必须有一种更简洁、更直接的方式来从我自己的应用程序中以编程方式调用请求管道......

    最佳答案

    是的,这实际上相当容易。您可以在 Startup 类 Configure 方法的末尾获取对请求管道的引用。将其保存在静态字段/单例服务/等中。

    public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    {
    // ... usual configuration code

    AClass.PipelineStaticField = app.Build();
    }
    然后,在您希望注入(inject)请求的方法中,您必须构建一个 HttpContext 以传递到管道中。
    var ctx = new DefaultHttpContext();

    // setup a DI scope for scoped services in your controllers etc.
    using var scope = _provider.CreateScope();
    ctx.RequestServices = scope.ServiceProvider;

    // prepare the request as needed
    ctx.Request.Body = new MemoryStream(...);
    ctx.Request.ContentType = "application/json";
    ctx.Request.ContentLength = 1234;
    ctx.Request.Method = "POST";
    ctx.Request.Path = PathString.FromUriComponent("/mycontroller/action");

    // you only need this if you are hosting in IIS (.UseIISIntegration())
    ctx.Request.Headers["MS-ASPNETCORE-TOKEN"] = Environment.GetEnvironmentVariable("ASPNETCORE_TOKEN");

    // setup a place to hold the response body
    ctx.Response.Body = new MemoryStream();

    // execute the request
    await AClass.PipelineStaticField(ctx);

    // interpret the result as needed, e.g. parse the body
    ctx.Response.Body.Seek(0, SeekOrigin.Begin);
    using var reader = new StreamReader(ctx.Response.Body);
    string body = await reader.ReadToEndAsync();
    这样,您的请求将遍历整个管道,包括所有中间件,例如身份验证和授权。

    关于asp.net-core - 以编程方式调用 ASP.NET Core 请求管道,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50407760/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com