2016-09-16 2 views
-1

나는 asp.net 코어에서 프록시 서비스를하고, 요청이 다른 서비스로 라우팅 될 확장 기능을 제공한다.어떻게 asp.net 코어 보편적 인 프록시

내 확장자 :

public static IApplicationBuilder UseProxy(this IApplicationBuilder builder, List<ProxySetting> options) 
    { 
     builder.Use(async (context, next) => 
     { 
      var resultPathHandler = options.ProxySettingHandler(context.Request.Path, context.Request.Method); 

      if (!resultPathHandler.Equal) 
       //continues through the rest of the pipeline 
       await next(); 
      else 
      { 
       using (var httpClient = new HttpClient()) 
       { 
        var pathSetting = resultPathHandler.Setting; 
        var requestMessage = new HttpRequestMessage(); 

        //добавляем хедеры 
        foreach (var header in context.Request.Headers) 
        { 
         if (!httpClient.DefaultRequestHeaders.TryAddWithoutValidation(header.Key, header.Value.ToArray())) 
         { 
          httpClient.DefaultRequestHeaders.TryAddWithoutValidation(header.Key, 
           header.Value.ToArray()); 
         } 
        } 


        if (context.Request.HasFormContentType && context.Request.Form.Count > 0) 
        { 
         var temp = new Dictionary<string, object>(); 
         foreach (var form in context.Request.Form) 
         { 
          requestMessage.Properties.Add(form.Key, form.Value); 
          temp.Add(form.Key, form.Value); 
         } 
         var jsonString = JsonConvert.SerializeObject(temp).Replace(":[", ":").Replace("],",","); 

         var mediatype = string.Empty; 
         if (context.Request.ContentType.Contains(';')) 
          mediatype = context.Request.ContentType.Split(';')[0]; 
         else 
          mediatype = context.Request.ContentType; 

         requestMessage.Content = new StringContent(jsonString, Encoding.UTF8, mediatype); 
        } 

        requestMessage.Headers.Host = pathSetting.Host; 
        var host = pathSetting.GetUri(context.Request.Path); 
        var uriString = $"{host}{context.Request.QueryString}"; 
        requestMessage.RequestUri = new Uri(uriString); 
        requestMessage.Method = new HttpMethod(pathSetting.Method); 
        var response = await httpClient.SendAsync(requestMessage); 
        var result = await response.Content.ReadAsStringAsync(); 
        var resultObj = JsonConvert.DeserializeObject<object>(result); 
        context.Response.StatusCode = (int)response.StatusCode; 
        await context.Response.WriteAsync(resultObj.ToString()); 
       } 
      } 
     }); 

     return builder; 
    } 

이 코드 :

   if (context.Request.HasFormContentType && context.Request.Form.Count > 0) 
       { 
        var temp = new Dictionary<string, object>(); 
        foreach (var form in context.Request.Form) 
        { 
         requestMessage.Properties.Add(form.Key, form.Value); 
         temp.Add(form.Key, form.Value); 
        } 
        var jsonString = JsonConvert.SerializeObject(temp).Replace(":[", ":").Replace("],",","); 

        var mediatype = string.Empty; 
        if (context.Request.ContentType.Contains(';')) 
         mediatype = context.Request.ContentType.Split(';')[0]; 
        else 
         mediatype = context.Request.ContentType; 

        requestMessage.Content = new StringContent(jsonString, Encoding.UTF8, mediatype); 
       } 

응용 프로그램/x-www-form-urlencoded로 또는 응용 프로그램/폼 데이터, 컨텐츠가에 추가 매개 변수를 넣어, 다른 서비스에 보내지 만, 나는 다른 서비스에서이 매개 변수를 얻지 못한다. 도와주세요.이 기능을 해제해야합니다. Thx와 나의 나쁜 영어에 대한 미안.

답변

0

당신은 바퀴를 재발 명할 필요가 없다. ASP.NET 코어는 이미 가지고 있으며 자신의 ProxyMiddleware을 제공합니다.

관련 문제