我在使用HttpClient和BaseAddress属性调用webHttpBinding WCF端点时遇到问题.
HttpClient的
我创建了一个HttpClient实例,将BaseAddress属性指定为本地主机端点.

GetAsync Call
然后我调用GetAsync方法传递额外的Uri信息.
HttpResponseMessage response = await client.GetAsync(string.Format("/Layouts/{0}", machineInformation.LocalMachineName()));
Run Code Online (Sandbox Code Playgroud)

服务端点
[OperationContract]
[WebGet(UriTemplate = "/Layouts/{machineAssetName}", ResponseFormat = WebMessageFormat.Json)]
List<LayoutsDto> GetLayouts(string machineAssetName);
Run Code Online (Sandbox Code Playgroud)
问题
我遇到的问题是,是,/AndonService.svc所述BaseAddress的一部分被截断,从而将得到的呼叫转到https://localhost:44302/Layouts/1100-00277宁可https://localhost:44302/AndonService.svc/Layouts/1100-00277导致404未找到.
是否有理由在GetAsync调用中截断BaseAddress?我该如何解决这个问题?
我们使用HttpClient. 我正在创建一个HttpClient用于所有这些 API 调用的通用对象。我对实现这一点的两种方法感到困惑:
HttpClient通过在get/post/put方法中传递 API URI,为每个调用创建一个单例类并使用它。HttpClientHandler将在所有HttpClients之间共享的单例类,并HtppClient通过设置BaseAddress属性为每个域创建一个。现在我们可以通过在get/post/put方法中传递相对路径来调用 API 。哪一种是更好的方法?
预设有什么好处BaseAddress吗?如果没有,为什么提供这个属性?
我有一个旧版本的ASP.NET MVC应用程序没有Startup.cs.我想实现一种干净的方式,HttpClient以便我可以使用我的API调用第三方.
这是我到目前为止基于我收到的关于这个问题的一些想法/建议所做的.问题是,当我进行API调用时,它无处可去.我把它放在一个try catch但我甚至没有得到例外.API提供商告诉我他们没有看到搜索参数.
首先,我HttpClientAccessor为延迟加载创建了这个.
public static class HttpClientAccessor
{
public static Func<HttpClient> ValueFactory = () =>
{
var client = new HttpClient();
client.BaseAddress = new Uri("https://apiUrl.com");
client.DefaultRequestHeaders.Accept.Clear();
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
client.DefaultRequestHeaders.TryAddWithoutValidation("APIAccessToken", "token1");
client.DefaultRequestHeaders.TryAddWithoutValidation("UserToken", "token2");
return client;
};
private static Lazy<HttpClient> client = new Lazy<HttpClient>(ValueFactory);
public static HttpClient HttpClient
{
get { return client.Value; }
}
}
Run Code Online (Sandbox Code Playgroud)
然后我创建了一个自己的API客户端,以便我可以在一个地方使用API调用函数,如下所示:
public class MyApiClient
{
public async Task GetSomeData()
{
var client = HttpClientAccessor.HttpClient;
try
{ …Run Code Online (Sandbox Code Playgroud) 根据这个
https://msdn.microsoft.com/en-us/library/system.net.http.httpclient.baseaddress(v=vs.118).aspx
它包含基地址。嗯,呃……
我不知道微软的文档是否可以理解。基地址到底是什么?
是只有主机名的 URL 吗?
喜欢StackOverflow.com?
是整个网址吗stackoverflow.com/question/ask
是否是包含参数的整个URL,例如stackoverflow.com/hello/world?dfdsdf=34fgdsg
什么是基地址?
我有一个托管在 Azure(应用程序服务)上的简单 Web 应用程序,它调用两个不同的外部 API。昨天,我们的流量出现了巨大的预期峰值,整个事情崩溃了,我现在意识到这是因为我正在创建和处置 HttpClient 的新实例,如下所示:
var url = "https://www.externalapi.com/someendpoint" +
"/takethedata.js?" +
"[form]email=" + visitor.EmailAddress +
"&[form]name=" + visitor.FirstName + " " + visitor.LastName +
"&[form]zip=" + visitor.zip +
"&[form]location=" + city + ", " + state;
using(var handler = new HttpClientHandler())
{
handler.ClientCertificateOptions = ClientCertificateOption.Manual;
handler.ServerCertificateCustomValidationCallback = (message, cert, chain, errors) => true;
handler.SslProtocols = System.Security.Authentication.SslProtocols.Tls12 |
System.Security.Authentication.SslProtocols.Tls11 |
System.Security.Authentication.SslProtocols.Tls;
using(var client = new HttpClient(handler))
{
client.BaseAddress = new Uri(url);
client.DefaultRequestHeaders.Accept.Clear();
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
HttpResponseMessage response = await …Run Code Online (Sandbox Code Playgroud)