2014-09-11 20 views
5

Có một điểm cuối API ASP.NET Web để tạo ra các phản hồi JSON. Nhưng do hai yếu tố không thể được tiêu thụ trực tiếp từ trình duyệt.proxy bên trong "trong suốt" cho các yêu cầu đối với ASP.NET Web API

  1. cross-domain hành
  2. cần cung cấp vé phiên cho các API mà chỉ được biết đến phía máy chủ

Vì vậy, tôi cần một proxy server side nhẹ cho khách hàng (trình duyệt) yêu cầu để mở rộng yêu cầu với khóa phiên. Không muốn áp đặt yêu cầu JSON khách hàng deserializing trên máy khách hoặc phản hồi JSON Web API trong mã proxy. Muốn chuyển tải trọng "như là" và deserialize yêu cầu của khách hàng chỉ Web API bên và Web API phản ứng chỉ phía khách hàng (trình duyệt). Đó là proxy lấy json từ trình duyệt và chuyển nó trực tiếp đến Web API. Nó cũng chuyển trả lời JSON từ API Web tới trình duyệt trực tiếp mà không cần deserialization. Chỉ cần một proxy giả mà không biết bất cứ điều gì về dữ liệu nó chuyển. Xin đề nghị là nó khả thi và cách tốt nhất để thực hiện nó là gì. Ứng dụng web hiện có (ứng dụng được sử dụng để tạo các trang khách hàng) được triển khai bằng ASP.NET MVC 4.

Cảm ơn bạn trước.

Trả lời

9

I wrote one for a previous version of WebApi. Mã nên khá dễ dàng để cập nhật cho các mục đích của bạn.

Ý tưởng cơ bản là bạn nên tạo một DelegatingHandler WebAPI đã vượt qua yêu cầu trên một HttpClient:

public class ForwardProxyMessageHandler : DelegatingHandler 
    { 
     protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) 
     { 
      request.Headers.Add("X-Forwarded-For", request.GetClientIp()); 
      if (request.Method == HttpMethod.Get || request.Method == HttpMethod.Trace) request.Content = null; 
      request.RequestUri = new Uri(request.RequestUri.ToString().Replace(":3002", "")); //comes through with the port for the proxy, rewrite to port 80 
      request.Headers.AcceptEncoding.Clear(); 
      var responseMessage = await new HttpClient().SendAsync(request, HttpCompletionOption.ResponseHeadersRead); 
      responseMessage.Headers.TransferEncodingChunked = null; //throws an error on calls to WebApi results 
      if (request.Method == HttpMethod.Head) responseMessage.Content = null; 
      return responseMessage; 
     } 

    } 
+1

Thank you very much. – AGS

+0

Làm cách nào bạn kết hợp điều này vào bộ điều khiển api trên web cho một đường dẫn nhất định? – Benchik

+0

Tôi nghĩ bạn chỉ cần đăng ký tuyến đường riêng của mình chứ không phải là một phần của bộ điều khiển khác. – mcintyre321

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