【问题标题】:Creating an API proxy in ASP.NET MVC 6在 ASP.NET MVC 6 中创建 API 代理
【发布时间】:2016-01-21 19:12:21
【问题描述】:

我正在从现有的 WebApi 2 项目迁移代码,我想知道如何在 ASP.NET 5 MVC 6 中执行与以下代码等效的操作。我没有看到任何接受处理程序选项的路由代码。

config.Routes.MapHttpRoute("SomeApiProxy", "api/someapi/{*path}",
    handler: HttpClientFactory.CreatePipeline(new HttpClientHandler(), new DelegatingHandler[] {new ForwardingProxyHandler(new Uri("http://some-api.com/api/v2/"))}),
    defaults: new {path = RouteParameter.Optional},
    constraints: null
);

【问题讨论】:

  • 只是获取请求还是任何请求?

标签: c# asp.net-web-api asp.net-core asp.net-core-mvc


【解决方案1】:

这只是我的想法,但您可以创建一个中间件。这适用于没有标头的 get 请求,但可以修改以执行更多操作。

app.Use( async ( context, next ) =>
{
    var pathAndQuery = context.Request.GetUri().PathAndQuery;

    const string apiEndpoint = "/api/someapi/";
    if ( !pathAndQuery.StartsWith( apiEndpoint ) )
        //continues through the rest of the pipeline
        await next();
    else
    {
        using ( var httpClient = new HttpClient() )
        {
            var response = await httpClient.GetAsync( "http://some-api.com/api/v2/" + pathAndQuery.Replace( apiEndpoint, "" ) );
            var result = await response.Content.ReadAsStringAsync();

            context.Response.StatusCode = (int)response.StatusCode;
            await context.Response.WriteAsync( result );
        }
    }
} );

如果你把它放在 app.UseMvc() 上,它将拦截路径以 /api/someapi 开头的任何请求

【讨论】:

【解决方案2】:

我们实际上为此编写了一个中间件(我们的实习生确实做到了:))https://github.com/aspnet/Proxy

【讨论】:

  • 谢谢。看起来它代理了所有请求。我错过了什么吗?我需要根据传入的路由/URL/请求代理某些请求。无论哪种方式,它都是有用的参考。
  • 酷,谢谢分享!只是想问一下 - 它是否有此处描述的套接字问题(如创建新的 HttpClient()):aspnetmonsters.com/2016/08/2016-08-27-httpclientwrong
  • @ChrisPutnam 。使用 app.UseWhen 选择您希望应用的位置/时间。代理中间件工作得很好。向实习生竖起大拇指
猜你喜欢
  • 2016-07-02
  • 2016-09-10
  • 1970-01-01
  • 2023-01-27
  • 1970-01-01
  • 1970-01-01
  • 2023-04-11
  • 1970-01-01
  • 2017-02-19
相关资源
最近更新 更多