相关文章推荐
体贴的充电器  ·  关于公开征求河南宋基信阳实验中学收费标准意见 ...·  9 月前    · 
淡定的大脸猫  ·  增量房房产交易涉税业务·  1 年前    · 
另类的蚂蚁  ·  柳永最经典的20首诗词,你可以不会背,但一定 ...·  1 年前    · 
不要命的茶叶  ·  透视蜜雪冰城IPO:直营门店毛利率为负百亿营 ...·  1 年前    · 
刀枪不入的莴苣  ·  中心会务服务部开展新进员工集中培训-漯河市机 ...·  1 年前    · 
小百科  ›  十二、.net core(.NET 6)填入商用的访问webapi的方法(和HttpClient和HttpWebRequest)-阿里云开发者社区
data 数据库接口 webapi string
魁梧的饭盒
1 年前
产品 解决方案 文档与社区 免费试用 定价 云市场 合作伙伴 支持与服务 了解阿里云
备案 控制台 登录/注册
开发者社区
首页
探索云世界
新手上云 云上应用构建 云上数据管理 云上探索人工智能
云计算 弹性计算 无影 存储 网络 倚天
云原生 容器 serverless 中间件 微服务 可观测 消息队列
数据库 关系型数据库 NoSQL数据库 数据仓库 数据管理工具 PolarDB开源 向量数据库

热门

Modelscope模型即服务 弹性计算 云原生 数据库 物联网 云效DevOps 龙蜥操作系统 平头哥 钉钉开放平台
大数据 大数据计算 实时数仓Hologres 实时计算Flink E-MapReduce DataWorks Elasticsearch 机器学习平台PAI 智能搜索推荐
人工智能 机器学习平台PAI 视觉智能开放平台 智能语音交互 自然语言处理 多模态模型 pythonsdk 通用模型
开发与运维 云效DevOps 钉钉宜搭 支持服务 镜像站 码上公益
问产品
动手实践
考认证
TIANCHI大赛
活动广场
任务中心 飞天Club技术沙龙 训练营 话题 开发者评测 乘风者计划 阿里云MVP 直播
下载
镜像站 技术资料 插件
本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《 阿里云开发者社区用户服务协议 》和 《 阿里云开发者社区知识产权保护指引 》。如果您发现本社区中有涉嫌抄袭的内容,填写 侵权投诉表单 进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。


开发通用的访问webapi方法。

在common工具文件夹下,新建一个类库项目:Wsk.Core.WebHelper,并引用Package包项目,然后新建一个类HttpClientHelper,用于使用HttpClient方法进行访问webapi:

1995789-20210606190523027-1881363596.png

新建一个接口IHttpClientHelper,用于HttpClientHelper继承该接口。然后接口内新增一个返回泛型类型的通用的POST访问webapi的方法:

1995789-20210606190552738-1803264386.png

接着,在HttpClientHelper类里面,进行对该方法的实现:

1995789-20210606190607859-2066938035.png


说明:虽然使用了using,可以自动释放资源;但是难免还是需要一点时间。在finally下面通过手动释放资源,比自动释放资源,资源释放率会更快,在并发场景下,性能会更好一点点。当然,此处可以不适用using,因为手动释放了,以上纯属个人喜好的风格写法。


再来一个使用Basic加密进行访问的通用方法,写法如上,具体请看代码示例。先新建带用户名和密码参数的接口:

1995789-20210606190726411-1206750832.png

然后,在HttpClientHelper里面进行对应的实现:

1995789-20210606190740123-855045588.png

以上为使用POST的方式进行,如果需要使用例如GET、PUT等,可以自行尝试,写法类似。


接口代码:


public interface IHttpClientHelper
        /// <summary>
        /// 通用访问webapi方法
        /// </summary>
        /// <param name="url"></param>
        /// <param name="data"></param>
        /// <returns></returns>
        T Post<T>(string url, string data);
        /// <summary>
        /// 带用户名和密码的通用访问webapi方法
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="url"></param>
        /// <param name="data"></param>
        /// <param name="account">用户名</param>
        /// <param name="pwd">密码</param>
        /// <returns></returns>
        T Post<T>(string url, string data, string account, string pwd);
    }


实现类代码:


public class HttpClientHelper:IHttpClientHelper
        readonly ILogger<HttpClientHelper> _logger;
        public HttpClientHelper(ILogger<HttpClientHelper> logger)
            _logger = logger;
        public T Post<T>(string url, string data)
            var result = default(T);
            using (HttpClient client = new HttpClient())





    
                    client.Timeout = new TimeSpan(0, 0, 10); // 10是秒数,用于设置超时时长
                    HttpContent content = new StringContent(data);
                    content.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue("application/json");
                    client.DefaultRequestHeaders.Connection.Add("keep-alive");
                    Task<HttpResponseMessage> res = client.PostAsync(url, content);
                    if (res.Result.StatusCode == System.Net.HttpStatusCode.OK)
                        result = JsonConvert.DeserializeObject<T>(res.Result.Content.ReadAsStringAsync().Result);
                        _logger.LogError($"访问webapi方法状态码错误:\r url:{url} \r data:{data} \r 状态码:{res.Result.StatusCode}");
                catch (Exception ex)
                    _logger.LogError($"访问webapi方法异常:\r url:{url} \r data:{data} \r 异常信息:{ex.Message}");
                finally
                    client.Dispose();
            return result;
        public T Post<T>(string url, string data, string account, string pwd)
            var result = default(T);
            using (HttpClient client = new HttpClient())
                    string authorization = "Basic " + Convert.ToBase64String(Encoding.UTF8.GetBytes(account + ":" + pwd));
                    client.DefaultRequestHeaders.Add("authorization", authorization);
                    client.Timeout = new TimeSpan(0, 0, 10);
                    HttpContent content = new StringContent(data);
                    content.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue("application/json");
                    Task<HttpResponseMessage> res = client.PostAsync(url, content);
                    if (res.Result.StatusCode == System.Net.HttpStatusCode.OK)
                        result = JsonConvert.DeserializeObject<T>(res.Result.Content.ReadAsStringAsync().Result);
                        _logger.LogError($"访问带用户名参数的webapi方法状态码错误:\r url:{url} \r data:{data} \r 状态码:{res.Result.StatusCode}");
                catch (Exception ex)
                    _logger.LogError($"访问带用户名参数的webapi方法异常:\r url:{url} \r data:{data} \r 异常信息:{ex.Message}");
                finally





    
                    client.Dispose();
            return result;
    }


现在再新建一个使用HttpWebRequest的通用访问webapi的方式。在WebHelper项目下面,新建 HttpWebRequestHelper类,以及IHttpWebRequestHelper接口:


1995789-20210606190921148-924208770.png


在接口里面,新建一个通用的泛型类型的访问webapi的请求接口:

1995789-20210606190933782-1025215566.png


然后,在HttpWebRequestHelper类里面,进行有关的实现:


1995789-20210606190952366-1159103896.png

HttpWebRequest没有Dispose方法,所以此处没有使用using写法,最后需要手动使用Abort方法进行释放资源。


接口代码:


public interface IHttpWebRequestHelper
        /// <summary>
        /// 通用方法
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="url"></param>
        /// <param name="data"></param>
        /// <param name="method">默认POST</param>
        /// <returns></returns>
        T Request<T>(string url, string data, string method = "POST");
    }


接口实现代码:


public class HttpWebRequestHelper:IHttpWebRequestHelper
        readonly ILogger<HttpWebRequestHelper> _logger;
        public HttpWebRequestHelper(ILogger<HttpWebRequestHelper> logger)





    
            _logger = logger;
        public T Request<T>(string url, string data,string method="POST")
            var result = default(T);
            HttpWebRequest request = null;
                request = (HttpWebRequest)WebRequest.Create(url);
                var byteData = Encoding.UTF8.GetBytes(data);
                request.Method = method;
                request.ContentType = "application/json"; 
                request.ContentLength = data.Length;
                request.Timeout = 10000; // 超时时间,毫秒单位
                using (var stream = request.GetRequestStream())
                    stream.Write(byteData, 0, data.Length);
                var response = (HttpWebResponse)request.GetResponse(); // 发送请求
                using (var resStream = response.GetResponseStream()) // 读取数据
                    using (var reader = new StreamReader(resStream, Encoding.UTF8))
                        result = JsonConvert.DeserializeObject<T>(reader.ReadToEnd()); 
            catch (Exception ex)
                  _logger.LogError($"使用HttpWebRequest访问webapi方法异常:\r url:{url} \r data:{data} \r 异常信息:{ex.Message}");
            finally
                if (request != null)
                    request.Abort(); // 释放资源
            return result;
    }


现在开发两个webapi进行测试。首先把该类库项目,添加到启动项目的项目引用里面。然后,在启动项目里面的AutofacRegister里面,添加对Wsk.Core.WebHelper类库项目的所有接口进行依赖注入注册:

1995789-20210606191315025-211510183.png


注册部分代码:


var assemblysWebhelper = Assembly.Load("Wsk.Core.WebHelper"); // 
            container.RegisterAssemblyTypes(assemblysWebhelper)





    
                .SingleInstance()
               .AsImplementedInterfaces() 
               .EnableInterfaceInterceptors();


新建一个实体类,用来当作参数和返回值的测试:


1995789-20210606191410614-1039858461.png

接着,在控制器里面写几个测试方法进行测试,测试内容如下:

1995789-20210606191423276-1887306644.png


控制器部分代码:


[Route("[controller]/[action]")]
    [ApiController]
    public class WSKController : ControllerBase
        private readonly ITestAutofac _autofac;
        private readonly ILogger<WSKController> _logger;
        private readonly IRedisManage _redis;
        private readonly IHttpClientHelper _httpClient;
        private readonly IHttpWebRequestHelper _httpWebRequestHelper;
        public WSKController(ITestAutofac autofac, ILogger<WSKController> logger, IRedisManage redis, IHttpClientHelper httpClient, IHttpWebRequestHelper httpWebRequestHelper) {
            _autofac = autofac;
            _logger = logger;
            _redis = redis;
            _httpClient = httpClient;
            _httpWebRequestHelper = httpWebRequestHelper;
        [HttpPost]
        public IActionResult HelloWorld(string url1,string url2)
            TestWebHelperInfo info = new TestWebHelperInfo();
            info.name = "Hello";
            var value1 = _httpClient.Post<TestWebHelperInfo>(url1,JsonConvert.SerializeObject(info));
            info.name = "World";
            var value2 = _httpWebRequestHelper.Request<TestWebHelperInfo>(url2, JsonConvert.SerializeObject(info));
            return Ok($"value1:{value1.name} value2:{value2.name}");
        [HttpPost]
        public IActionResult Test1([FromBody] TestWebHelperInfo info)
            return Ok(info);
        [HttpPost]
        public IActionResult Test2([FromBody] TestWebHelperInfo info)
            return Ok(info);
    }


运行,然后测试一下1和2接口是否可以使用,如果可以使用,拷贝对应的url地址,当作参数传给主测试api里面。

1995789-20210606191526921-676627913.png


获得到请求的url地址前缀是:http://localhost:35678/WSK/,带入参数进行验证:

1995789-20210606191547907-1589423717.png

由此可见,两个通用方法都可用。


备注:如果不适用泛型,也可以直接使用返回String即可,不需要进行类型转换。


云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore &nbsp; &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
 
推荐文章
体贴的充电器  ·  关于公开征求河南宋基信阳实验中学收费标准意见的公告- 决策预公开 ...
9 月前
淡定的大脸猫  ·  增量房房产交易涉税业务
1 年前
另类的蚂蚁  ·  柳永最经典的20首诗词,你可以不会背,但一定要读一次_手机搜狐网
1 年前
不要命的茶叶  ·  透视蜜雪冰城IPO:直营门店毛利率为负百亿营收加盟商占绝对“优势 ...
1 年前
刀枪不入的莴苣  ·  中心会务服务部开展新进员工集中培训-漯河市机关事务中心
1 年前
今天看啥   ·   Py中国   ·   codingpro   ·   小百科   ·   link之家   ·   卧龙AI搜索
删除内容请联系邮箱 2879853325@qq.com
小百科 - 百科知识指南
© 2024 ~ 沪ICP备11025650号