登录
注册
开源
企业版
高校版
搜索
帮助中心
使用条款
关于我们
开源
企业版
高校版
私有云
模力方舟
AI 队友
登录
注册
轻量养虾,开箱即用!低 Token + 稳定算力,Gitee & 模力方舟联合出品的 PocketClaw 正式开售!点击了解详情
代码拉取完成,页面将自动刷新
开源项目
>
WEB应用开发
>
Web开发框架
&&
捐赠
捐赠前请先登录
取消
前往登录
扫描微信二维码支付
取消
支付完成
支付提示
将跳转至支付宝完成支付
确定
取消
Watch
不关注
关注所有动态
仅关注版本发行动态
关注但不提醒动态
9.9K
Star
14.5K
Fork
4.2K
GVP
dotNET China
/
Furion
代码
Issues
0
Pull Requests
0
统计
流水线
服务
质量分析
Jenkins for Gitee
腾讯云托管
腾讯云 Serverless
悬镜安全
阿里云 SAE
Codeblitz
SBOM
开发画像分析
我知道了,不再自动展开
更新失败,请稍后重试!
移除标识
内容风险标识
本任务被
标识为内容中包含有代码安全 Bug 、隐私泄露等敏感信息,仓库外成员不可访问
在默认请求客户端下,RequestUrl 不可为空的问题(不算 BUG )
已完成
#I5OWBO
taoran
创建于
2022-08-30 22:26
### Furion 版本号 4.3.4 --- ### .NET SDK 版本号 - [x] .NET6 --- ### Web 项目类型 - [x] WebApi --- ### 操作系统和版本 - [x] Windows(版本) --- ### 代码环境 - [x] 开发环境(Development) --- ### 描述你的问题 #### 第 一 个问题: 当前项目使用远程请求的 IHttpDispatchProxy 代理方式,默认请求客户端配置了 BaseAddress ,如果代理请求的 Requesturl 为空,肯定会报错。因为大部分 URL 都是在 HttpClient 中处理的,如果刚好代理的特性上没有 Requesturl 就很难受。 如下: ``` service.AddHttpClient(string.Empty, client => { client.BaseAddress = new Uri("https://localhost:5001/api/"); // client.DefaultRequestHeaders.Add("Accept", ""); // client.DefaultRequestHeaders.Add("User-Agent", ""); } /// 是一个泛型的,最终会在 HttpClient 拦截或者请求之前拦截 中获取并附上当前实体名称 [Put("")] Task<RESTfulResult<bool>> UpdateAsync([Body] T obj); [Get("findById")] Task<RESTfulResult<T>> FindByIdAsync([QueryString]object key); /// <summary> /// HttpClient 拦截 /// </summary> /// <param name="req"></param> [Interceptor(InterceptorTypes.Client)] static void OnBaseClientCreating(HttpClient req) { if (req.BaseAddress == null) { throw Oops.Oh("请求 Uri 为空"); } var builder = new UriBuilder(req.BaseAddress!); var path = req.BaseAddress!.AbsolutePath; var name = typeof(T).Name.Replace("Entity", string.Empty); builder.Path = $"{path}{string.Concat(name.First().ToString().ToLower(), name.AsSpan(1))}/"; req.BaseAddress = builder.Uri; } ``` 因为有下面的判断(HttpRequestPart 中的 SendAsync 方法),所以必报错: ``` /// <summary>发送请求</summary> /// <param name="cancellationToken"></param> /// <returns></returns> public async Task<HttpResponseMessage> SendAsync( CancellationToken cancellationToken = default (CancellationToken)) { HttpRequestPart sender = this; if (sender.Method == (HttpMethod) null) throw new NullReferenceException("Method"); if (string.IsNullOrWhiteSpace(sender.ClientName) && string.IsNullOrWhiteSpace(sender.RequestUrl)) throw new NullReferenceException(sender.RequestUrl); } ``` 所以,如果 sender.ClientName 等于空(默认配置),RequestUrl 就一定不能为空么,这个逻辑能不能改变? 由于 string.IsNullOrWhiteSpace(sender.RequestUrl) 是在 HttpRequestMessage 拦截 之前判断的,所以我想在 HttpRequestMessage 拦截中提前处理 RequestUrl 避免报错也是没办法。 #### 第 二 个问题: 目前看来,代理请求方法中的相关特性(Get/QueryString)都是必填的,不填会报错。可不可以懒一点,就沿用动态 API 的逻辑,让他们有个默认值。 :smile: 至少帮忙判断一下方法的参数嘛,每个参数都要写 [Body] 或者 [QueryString] 好累啊。 :stuck_out_tongue_closed_eyes: ``` [Get("findById")] Task<RESTfulResult<T>> FindByIdAsync([QueryString]object key); ``` --- ### 异常堆栈信息 `throw new NullReferenceException(sender.RequestUrl);` 报: ``` System.NullReferenceException: Exception of type 'System.NullReferenceException' was thrown. at Furion.RemoteRequest.HttpRequestPart.SendAsync(CancellationToken cancellationToken) at Furion.RemoteRequest.HttpRequestPart.SendAsStringAsync(CancellationToken cancellationToken) at Furion.RemoteRequest.HttpRequestPart.SendAsAsync[T](CancellationToken cancellationToken) at Furion.Reflection.AspectDispatchProxyGenerator.InvokeAsync[T](Object[] args) at HelloService.caiyun(CaiYun searchInfos) in D:\OneDrive\Code\HelloFurion\Program.cs:line 19 ``` --- ### 测试项目代码 https://replit.com/@staoran/HelloFurion#Program.cs --- ### 期待结果 HttpRequestPart 中的 RequestUrl 可空 ---
### Furion 版本号 4.3.4 --- ### .NET SDK 版本号 - [x] .NET6 --- ### Web 项目类型 - [x] WebApi --- ### 操作系统和版本 - [x] Windows(版本) --- ### 代码环境 - [x] 开发环境(Development) --- ### 描述你的问题 #### 第 一 个问题: 当前项目使用远程请求的 IHttpDispatchProxy 代理方式,默认请求客户端配置了 BaseAddress ,如果代理请求的 Requesturl 为空,肯定会报错。因为大部分 URL 都是在 HttpClient 中处理的,如果刚好代理的特性上没有 Requesturl 就很难受。 如下: ``` service.AddHttpClient(string.Empty, client => { client.BaseAddress = new Uri("https://localhost:5001/api/"); // client.DefaultRequestHeaders.Add("Accept", ""); // client.DefaultRequestHeaders.Add("User-Agent", ""); } /// 是一个泛型的,最终会在 HttpClient 拦截或者请求之前拦截 中获取并附上当前实体名称 [Put("")] Task<RESTfulResult<bool>> UpdateAsync([Body] T obj); [Get("findById")] Task<RESTfulResult<T>> FindByIdAsync([QueryString]object key); /// <summary> /// HttpClient 拦截 /// </summary> /// <param name="req"></param> [Interceptor(InterceptorTypes.Client)] static void OnBaseClientCreating(HttpClient req) { if (req.BaseAddress == null) { throw Oops.Oh("请求 Uri 为空"); } var builder = new UriBuilder(req.BaseAddress!); var path = req.BaseAddress!.AbsolutePath; var name = typeof(T).Name.Replace("Entity", string.Empty); builder.Path = $"{path}{string.Concat(name.First().ToString().ToLower(), name.AsSpan(1))}/"; req.BaseAddress = builder.Uri; } ``` 因为有下面的判断(HttpRequestPart 中的 SendAsync 方法),所以必报错: ``` /// <summary>发送请求</summary> /// <param name="cancellationToken"></param> /// <returns></returns> public async Task<HttpResponseMessage> SendAsync( CancellationToken cancellationToken = default (CancellationToken)) { HttpRequestPart sender = this; if (sender.Method == (HttpMethod) null) throw new NullReferenceException("Method"); if (string.IsNullOrWhiteSpace(sender.ClientName) && string.IsNullOrWhiteSpace(sender.RequestUrl)) throw new NullReferenceException(sender.RequestUrl); } ``` 所以,如果 sender.ClientName 等于空(默认配置),RequestUrl 就一定不能为空么,这个逻辑能不能改变? 由于 string.IsNullOrWhiteSpace(sender.RequestUrl) 是在 HttpRequestMessage 拦截 之前判断的,所以我想在 HttpRequestMessage 拦截中提前处理 RequestUrl 避免报错也是没办法。 #### 第 二 个问题: 目前看来,代理请求方法中的相关特性(Get/QueryString)都是必填的,不填会报错。可不可以懒一点,就沿用动态 API 的逻辑,让他们有个默认值。 :smile: 至少帮忙判断一下方法的参数嘛,每个参数都要写 [Body] 或者 [QueryString] 好累啊。 :stuck_out_tongue_closed_eyes: ``` [Get("findById")] Task<RESTfulResult<T>> FindByIdAsync([QueryString]object key); ``` --- ### 异常堆栈信息 `throw new NullReferenceException(sender.RequestUrl);` 报: ``` System.NullReferenceException: Exception of type 'System.NullReferenceException' was thrown. at Furion.RemoteRequest.HttpRequestPart.SendAsync(CancellationToken cancellationToken) at Furion.RemoteRequest.HttpRequestPart.SendAsStringAsync(CancellationToken cancellationToken) at Furion.RemoteRequest.HttpRequestPart.SendAsAsync[T](CancellationToken cancellationToken) at Furion.Reflection.AspectDispatchProxyGenerator.InvokeAsync[T](Object[] args) at HelloService.caiyun(CaiYun searchInfos) in D:\OneDrive\Code\HelloFurion\Program.cs:line 19 ``` --- ### 测试项目代码 https://replit.com/@staoran/HelloFurion#Program.cs --- ### 期待结果 HttpRequestPart 中的 RequestUrl 可空 ---
评论 (
6
)
登录
后才可以发表评论
状态
已完成
待办的
进行中
已完成
已关闭
负责人
未设置
标签
未设置
标签管理
里程碑
未关联里程碑
未关联里程碑
Pull Requests
未关联
未关联
关联的 Pull Requests 被合并后可能会关闭此 issue
分支
未关联
分支 (
-
)
标签 (
-
)
开始日期   -   截止日期
-
置顶选项
不置顶
置顶等级:高
置顶等级:中
置顶等级:低
优先级
不指定
严重
主要
次要
不重要
参与者(2)
C#
1
https://gitee.com/dotnetchina/Furion.git
git@gitee.com:dotnetchina/Furion.git
dotnetchina
Furion
Furion
点此查找更多帮助
搜索帮助
Git 命令在线学习
如何在 Gitee 导入 GitHub 仓库
Git 仓库基础操作
企业版和社区版功能对比
SSH 公钥设置
如何处理代码冲突
仓库体积过大,如何减小?
如何找回被删除的仓库数据
Gitee 产品配额说明
GitHub仓库快速导入Gitee及同步更新
什么是 Release(发行版)
将 PHP 项目自动发布到 packagist.org
仓库举报
回到顶部
登录提示
该操作需登录 Gitee 帐号,请先登录后再操作。
立即登录
没有帐号,去注册