C# HttpClient 请求转发
最近在做一个项目,需要用到别人的接口,但是遇到一个问题,这个接口只能在服务器上访问,不支持外网访问,这让人有点头疼,本地开发没有对应的环境,不好调试,写好代码封装好发布到服务器,在进行前期测试太麻烦了,有没有什么好的办法可以在本地调试。在网上找了一下,确实有,那就是请求转发,大概原理是这样的,在服务器上布置一个接口访问程序,专门访问接口的,服务器是可以通过外网进行访问,那么可以通过服务器布置的程序去访问接口,再把返回的数据传输到本地进行测试。具体流程如下:

具体如何实现,我们可以使用HttpClicent ,在服务器部署一个中转接口,本地访问中转接口,中转接口访问没有对外开放的数据接口。以下代码基于Asp.net
1.做中转接口,可以使用asp.net webapi、webservice。


2.添加一个webapi控制器。编写如下代码。
using System.Collections.Generic;
using System.Net;
using System.Net.Http;
using System.Web.Http; namespace TransferPortProject.Controllers
{
[RoutePrefix("api/transfer")]
public class TransferController : ApiController
{
private HttpClient client = new HttpClient();
/// <summary>
/// 使用Get请求获取用户信息
/// </summary>
/// <param name="url">只允许服务器访问的接口地址</param>
/// <returns></returns>
[HttpGet]
[Route("user")]
public HttpResponseMessage GetUser([FromUri] string url)
{
return client.GetAsync(url).Result.EnsureSuccessStatusCode();//请求转发
}
/// <summary>
/// 使用Post请求转发获取部门数据
/// </summary>
/// <param name="url">只允许服务器访问的接口地址</param>
/// <param name="parameter">附加的请求参数</param>
/// <returns></returns>
[HttpPost]
[Route("department")]
public HttpResponseMessage GetDepartment([FromBody] string url,string parameter)
{
return client.PostAsync(url, Request.Content).Result.EnsureSuccessStatusCode();
}
/// <summary>
/// 使用Post转发获取学生数据,用form-data,注意,此处请求中转的是用普通请求,中转访问内部接口使用form-fata的方式请求数据
/// </summary>
/// <param name="url">只允许服务器访问的接口地址</param>
/// <param name="parameter">附加的请求参数列表</param>
/// <returns></returns>
[HttpPost]
[Route("student")]
public HttpResponseMessage GetStudent([FromBody] string url,List<ParameterEntity> parameter)
{
var formData=new MultipartFormDataContent();
if (parameter!=null)
{
foreach (var d in parameter)
{
formData.Add(new StringContent(d.Value),d.Name);//序列化对象
}
}
return client.PostAsync(url, formData).Result.EnsureSuccessStatusCode();
} /// <summary>
/// 使用Post转发上传文件
/// </summary>
/// <param name="url">只允许服务器访问的接口地址</param>
/// <returns></returns>
[HttpPost]
[Route("file")]
public HttpResponseMessage GetFile(string url)
{
if (!Request.Content.IsMimeMultipartContent())
{
//如果请求不是multipart/form-data类型,抛出异常
throw new HttpResponseException(HttpStatusCode.UnsupportedMediaType);
}
return client.PostAsync(url,Request.Content).Result.EnsureSuccessStatusCode();
} } public class ParameterEntity
{
/// <summary>
/// 参数名称
/// </summary>
public string Name { get; set; }
/// <summary>
/// 参数值
/// </summary>
public string Value { get; set; }
}
}
C# HttpClient 请求转发的更多相关文章
- .Net Core 3.0后台使用httpclient请求网络网页和图片_使用Core3.0做一个简单的代理服务器
目标:使用.net core最新的3.0版本,借助httpclient和本机的host域名代理,实现网络请求转发和内容获取,最终显示到目标客户端! 背景:本人在core领域是个新手,对core的使用不 ...
- .NET Core HttpClient请求异常详细情况分析
前言 最近项目上每天间断性捕获到HttpClient请求异常,感觉有点奇怪,于是乎观察了两三天,通过日志以及对接方沟通确认等等,查看对应版本源码,尝试添加部分配置发布后,观察十几小时暂无异常情况出现, ...
- 源码分析Gateway请求转发
本期我们主要还是讲解一下Gateway,上一期我们讲解了一下Gateway中进行路由转发的关键角色,过滤器和断言是如何被加载的,上期链接: https://www.cnblogs.com/guoxia ...
- 用 IIS 实现请求转发
最近部门要开发一个简单的APP,部分数据是现有项目已经存在的,为了方便维护,希望只提供一个交互的入口,并且协议的规则不变. 基于这个需求,有两套解决方案: 1.用代码将现有的api封装一层,对请求数据 ...
- Java Web中请求转发和请求包含
1.都是在一个请求中跨越多个Servlet 2.多个Servlet在一个请求中,他们共享request对象.就是在AServle中setAttribute()保存数据在BServlet中由getAtt ...
- nginx实现请求转发
反向代理适用于很多场合,负载均衡是最普遍的用法. nginx 作为目前最流行的web服务器之一,可以很方便地实现反向代理. nginx 反向代理官方文档: NGINX REVERSE PROXY 当在 ...
- spring mvc 请求转发和重定向(转)
spring mvc controller间跳转 重定向 传参 url:http://zghbwjl.blog.163.com/blog/static/12033667220137795252845/ ...
- SpringMVC源码剖析(四)- DispatcherServlet请求转发的实现
SpringMVC完成初始化流程之后,就进入Servlet标准生命周期的第二个阶段,即“service”阶段.在“service”阶段中,每一次Http请求到来,容器都会启动一个请求线程,通过serv ...
- 微信内嵌浏览器sessionid丢失问题,nginx ip_hash将所有请求转发到一台机器
现象微信中打开网页,图形验证码填写后,经常提示错误,即使填写正确也会提示错误,并且是间歇性出现. 系统前期,用户使用主要集中在pc浏览器中,一直没有出现这样的问题.近期有部分用户是在微信中访问的,才出 ...
随机推荐
- 后端渲染html、前端模板渲染html,jquery的html
作者:赵魏璇链接:https://www.zhihu.com/question/28725977/answer/116177149来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注 ...
- Oracle 表空间查询与操作方法
一.查询篇 1.查询oracle表空间的使用情况 select b.file_id 文件ID, b.tablespace_name 表空间, b.file_name 物理文件名, b.bytes ...
- 转转转---ROWNUMBER() OVER( PARTITION BY COL1 ORDER BY COL2)用法
ROWNUMBER() OVER( PARTITION BY COL1 ORDER BY COL2)用法 http://blog.csdn.net/yinshan33/article/detail ...
- MySQL 多表关联更新及删除
目录: <MySQL中的两种临时表> <MySQL 多表关联更新及删除> <mysql查询优化之三:查询优化器提示(hint)> 一. 多表关联更新 问题 ...
- Bootstrap-Other:可视化布局
ylbtech-Bootstrap-Other:可视化布局 1.返回顶部 1. 2. 2.返回顶部 3.返回顶部 4.返回顶部 5.返回顶部 1. http://www.runoob.co ...
- linux中grep工具
正则表达式 以前我们用grep在一个文件中找出包含某些字符串的行,比如在头文件中找出一个宏定义.其实grep还可以找出符合某个模式(Pattern)的一类字符串.例如找出所有符合xxxxx@xxxx. ...
- js 各种距离
网页可见区域宽 document.body.clientWidth 网页可见区域高 document.body.clientHeight 网页可见区域宽(包括边线的宽) document.b ...
- Windows下测量cpu利用率的类
方法参考网上的一段代码,把它改成了类以方便调用,很简单,但是可以一用,哈哈. cpu_usage.h #include <windows.h> class CpuUsage { publi ...
- Vim插件之ale,LeaderF,completor.vim(win10)配置
内容包含 vim-plug,异步插件管理,总之就是下起来快. ale,异步语法检查 LeaderF,快速查找文件 completor.vim vim8的快速补全 markdown预览 common s ...
- Spring IO Platform介绍
为什么要用Spring IO Platform 今天无意间看到了一个关键词:"Spring IO Platform",第一直觉是不是有关于IO方面的框架或者包呢,查了一下,居然是为 ...