考虑以下代码,其中BaseAddress定义了部分URI路径.

using (var handler = new HttpClientHandler())
using (var client = new HttpClient(handler))
{
    client.BaseAddress = new Uri("http://something.com/api");
    var response = await client.GetAsync("/resource/7");
}

我预计这将执行从GEThttp://something.com/api/resource/7的请求.但事实并非如此.

经过一番搜索,我找到了这个问题和答案:HttpClient with BaseAddress.建议将/放置在BaseAddress的末尾.

using (var handler = new HttpClientHandler())
using (var client = new HttpClient(handler))
{
    client.BaseAddress = new Uri("http://something.com/api/");
    var response = await client.GetAsync("/resource/7");
}

它仍然不起作用.这是文件:HttpClient.BaseAddress这是怎么回事?

推荐答案

事实证明,在四种可能的排列中,包括或排除BaseAddress上的尾随斜杠或前导正斜杠,以及传递给GetAsync方法的相对URI——或者HttpClient中的任何其他方法——只有one种排列有效.在BaseAddress的末尾放一个斜杠,在相对URI的开头放一个斜杠,如下例所示.

using (var handler = new HttpClientHandler())
using (var client = new HttpClient(handler))
{
    client.BaseAddress = new Uri("http://something.com/api/");
    var response = await client.GetAsync("resource/7");
}

尽管我回答了自己的问题,但我想我会在这里提出解决方案,因为这种不友好的行为同样是非法的.我的同事和我花了一天的大部分时间试图解决一个问题,这个问题最终是由这个奇怪的HttpClient.

.net相关问答推荐

.NET发布的应用程序运行与开发不同的端口

为什么.Net 8.0.100是预览版?

Puppeteer LaunchAsync 在未打开浏览器的情况下挂起

为什么我在环境变量中有不同的值?

如何在 NET 5 / 6 中使用 Direct3D11CaptureFramePool

在 C# 中,如何使用泛型的基类将泛型接口的所有实例注入到单个构造函数中?

C#6.0 字符串插值本地化

从 switch 块中跳出 foreach 循环

Environment.TickCount 与 DateTime.Now

C# 是否(或将)包含用于副作用验证的功能?

在 WPF 窗口中获取当前聚焦的元素/控件

LINQ 性能常见问题解答

如何将 NuGet 与 Visual C# Express 一起使用?

如何根据默认样式创建样式?

VB.NET 与 C# 整数除法

Iif 在 C# 中等效

IEnumerable vs IReadonlyCollection vs ReadonlyCollection 用于公开列表成员

无锁多线程适用于真正的线程专家

我可以为 Dictionary 条目使用集合初始化程序吗?

在构建事件命令行中放置注释的正确方法?