带有 BaseAddress 的 HttpClient

Posted

技术标签:

【中文标题】带有 BaseAddress 的 HttpClient【英文标题】:HttpClient with BaseAddress 【发布时间】:2013-12-16 10:54:23 【问题描述】:

我在使用HttpClient 和BaseAddress 属性调用webHttpBinding WCF 端点时遇到问题。

HttpClient

我创建了一个HttpClient 实例,将BaseAddress 属性指定为本地主机端点。

GetAsync 调用

然后我调用 GetAsync 方法,传入额外的 Uri 信息。

HttpResponseMessage response = await client.GetAsync(string.Format("/Layouts/0", machineInformation.LocalMachineName()));

服务端点

[OperationContract]
[WebGet(UriTemplate = "/Layouts/machineAssetName", ResponseFormat = WebMessageFormat.Json)]
List<LayoutsDto> GetLayouts(string machineAssetName);

问题

我遇到的问题是 BaseAddress 的 /AndonService.svc 部分被截断,因此结果调用转到 https://localhost:44302/Layouts/1100-00277 而不是 https://localhost:44302/AndonService.svc/Layouts/1100-00277 导致 404 Not Found。

BaseAddress 在 GetAsync 调用中被截断是否有原因?我该如何解决这个问题?

【问题讨论】:

Why is HttpClient BaseAddress not working? 的可能重复项 【参考方案1】:

BaseAddress 中,只需包含最后一个斜杠:https://localhost:44302/AndonService.svc/。如果不这样做,则路径的最后部分将被丢弃,因为它不被视为“目录”。

此示例代码说明了不同之处:

// No final slash
var baseUri = new Uri("https://localhost:44302/AndonService.svc");
var uri = new Uri(baseUri, "Layouts/1100-00277");
Console.WriteLine(uri);
// Prints "https://localhost:44302/Layouts/1100-00277"


// With final slash
var baseUri = new Uri("https://localhost:44302/AndonService.svc/");
var uri = new Uri(baseUri, "Layouts/1100-00277");
Console.WriteLine(uri);
// Prints "https://localhost:44302/AndonService.svc/Layouts/1100-00277"

【讨论】:

请在此处查看我的问题和答案:***.com/questions/23438416/… 这个答案遗漏了一个重要的细节。

以上是关于带有 BaseAddress 的 HttpClient的主要内容,如果未能解决你的问题,请参考以下文章

IHttpClientFactory 并更改基础 HttpClient.BaseAddress

设置`HttpClient`的`BaseAddress`属性有啥好处

C++ BaseAddress 和入口点地址

MEMORY_BASIC_INFORMATION 结构中的 BaseAddress 和 AllocationBase 有啥区别?

提供了无效的请求 URI。请求 URI 必须是绝对 URI 或必须设置 BaseAddress

在 Xamarin.forms C# 中显示带有 JSON 数据的列表