2016-01-21 17 views
8

Tôi đang di trú mã từ một dự án WebApi 2 hiện có và tôi tự hỏi làm thế nào để thực hiện tương đương với mã dưới đây trong ASP.NET 5 MVC 6. Tôi không thấy bất kỳ mã tuyến đường chấp nhận tùy chọn trình xử lý.Tạo một proxy API trong ASP.NET 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 
); 
+0

Có phải chỉ nhận được yêu cầu hoặc yêu cầu nào không? –

Trả lời

8

Đây chỉ là ngoài đỉnh đầu của tôi nhưng bạn có thể tạo phần mềm trung gian. Thao tác này sẽ hoạt động để nhận yêu cầu không có tiêu đề nhưng có thể được sửa đổi để thực hiện thêm.

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

Nếu bạn đặt này befire app.UseMvc() nó sẽ ngăn chặn bất kỳ yêu cầu trong đó con đường bắt đầu với/api/someapi

+0

Cảm ơn bạn đã trả lời của bạn, tôi đã có thể mở rộng về điều này và tạo ra một middleware đầy đủ mà những gì tôi cần. –

+0

Không có vấn đề vui mừng tôi có thể giúp –

+3

Tôi đã cố gắng để xây dựng mà vào một cái gì đó tái sử dụng cho tất cả mọi người. Bạn có thể tìm thấy nó trên GitHub ở đây: https://github.com/ZoolWay/GlacierCrates.AspNetCore.ApiProxy – ZoolWay

3

Chúng tôi thực sự đã viết một middleware cho điều này (cũng thực tập của chúng tôi đã làm :)) https://github.com/aspnet/Proxy

+2

Cảm ơn. Dường như nó proxy tất cả các yêu cầu mặc dù. Tui bỏ lỡ điều gì vậy? Tôi cần phải ủy quyền một số yêu cầu dựa trên tuyến đường/URL/yêu cầu đến. Dù bằng cách nào, nó là một tài liệu tham khảo hữu ích. –

+0

Tuyệt vời, cảm ơn bạn đã chia sẻ! Chỉ muốn hỏi - nó có vấn đề ổ cắm được mô tả ở đây (như tạo mới HttpClient()): https://aspnetmonsters.com/2016/08/2016-08-27-httpclientwrong/ –

+0

@ChrisPutnam. Sử dụng app.UseKhi chọn và chọn vị trí/thời điểm bạn muốn áp dụng. Proxy middleware hoạt động rất tốt. Thumbs up để thực tập –

Các vấn đề liên quan