我以这种方式将字符串发布到网络服务器:
private async Task makeRequest(string url, string postData)
{
HttpClient client = null;
HttpResponseMessage response = null;
try
{
client = new HttpClient();
response = await client.PostAsync(url, new StringContent(postData));
response.EnsureSuccessStatusCode();
Debug.WriteLine(response.StatusCode + " " + response.ReasonPhrase);
}
catch (HttpRequestException e)
{
Debug.WriteLine(e.Message);
}
}
Run Code Online (Sandbox Code Playgroud)
但response.EnsureSuccessStatusCode();抛出一个HttpRequestException. e.Message当我对异常进行处理时,它说: Response status code does not indicate success: 500 (Internal Server Error).。
我做错了什么导致出现该错误?我该如何纠正它?
c# internal-server-error dotnet-httpclient windows-phone-8 asynchttpclient
我对这个函数的名称有点困惑。为什么不只是TryAdd呢?它没有验证什么?如果我使用这个函数,在某些情况下它还会抛出异常吗?我可以以某种方式“尝试添加”而不会出现任何异常,并且如果失败则仅返回 false 吗?
编辑:我认为这两个问题是相互矛盾的。如果我调用 with ,TryAddWithoutValidation它实际上会添加无效标头,还是如果它们无效则返回 false ?
控制狂免责声明:是的,关于 HttpClient 和代理有很多问题,但它们至少使用其中之一
如果 HttpClientHandler.Proxy 默认值为 null,则 HttpClientHandler 将使用 IE 代理设置
因此,要使用 HttpClient 设置正确的公司代理,我们不需要任何其他操作,只需
_client = new HttpClient()
Run Code Online (Sandbox Code Playgroud)
并且没有官方方法来选择代理。但是我如何传递默认 AD 凭据以在自动发现的代理上进行身份验证呢?我刚刚收到“(407) 需要代理身份验证”。
PS 可能还有另一个问题,并且在特殊帐户下作为服务运行(尤其是在 Linux 上),此代码没有 IE 设置可供使用。所以我们需要重新实现WPAD。
我正在开发一个 C# 应用程序,它可以获取网页并逐行处理它们的内容。为此,我使用HttpClient该类,并通过ReadAsStreamAsync(). 然后我将流读入一个线数组并对其进行迭代。到现在为止还挺好。
但是,如果我使用 Chrome 或 Edge 导航到网页并使用“查看源”获取 HTML,我使用此方法获得的 HTML 与我观察到的 HTML 不同。特别是,__VIEWSTATE 和 __VIEWSTATEGENERATOR 隐藏input元素被div具有以下元素的元素包围class="aspNetHidden",当我使用的浏览器,而不是当我编程方式获得的HTML。这破坏了我的行跟踪逻辑,因为浏览器看到的页面中有额外的行,与我在代码中获取的页面相关。
编辑。经过一些测试,我确信客户端使用的用户代理标头决定了是否class="aspNetHidden" div提供服务。当我模仿浏览器的用户代理(“Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36 Edg/83.0.478.37”)时,服务div是 如果我使用其他代理,例如“测试客户端”,div则不会提供服务。
我的问题是,是否有任何文档说明哪些用户代理字符串会导致div提供服务,哪些不提供服务?另外,我可以防止这种情况发生吗?
谢谢。
我创建了一个自定义库,它会自动为依赖于HttpClient.
这是使用IServiceCollection扩展方法和类型化客户端方法来完成的。一个简化的例子:
public static IHttpClientBuilder SetUpFooServiceHttpClient(this IServiceCollection services)
{
return services
.AddHttpClient<FooService>()
.AddPolicyHandler(GetRetryPolicy());
}
Run Code Online (Sandbox Code Playgroud)
示例服务:
public class FooService
{
private readonly HttpClient _client;
// OPTION 1
public FooService(HttpClient httpClient)
{
_client = httpClient;
}
// OPTION 2
public FooService(IHttpClientFactory httpClientFactory)
{
_client = httpClientFactory.CreateClient(GetType().Name);
}
public void DoJob()
{
var test = _client.GetAsync("http://example.com");
}
}
Run Code Online (Sandbox Code Playgroud)
从 DI 容器中获取服务(来自测试项目):
var services = new ServiceCollection();
services.SetUpFooServiceHttpClient();
services.AddSingleton<FooService>();
var fooService = services
.BuildServiceProvider()
.GetRequiredService<FooService>();
// Perform test
fooService.DoJob();
Run Code Online (Sandbox Code Playgroud)
注意:在这个测试项目中,我还添加了一个额外的模拟处理程序,因为我试图模拟 …
根据问题 #1793,不需要使用像这样的怪癖将 .NET 5 中的 HttpClient 绑定到特定的本地 IP 地址。
然而,我对这个主题完全不知所措,同时 .NET Core 开发人员多年来一直无法为 .NET Core 提供选择 http 请求的传出 IP 地址的选项。即使向后兼容的 WebClient 也无法在早期的 .NET Core 版本中执行此操作,任何其他高级 HTTP API 也无法执行此操作。上帝(或任何人)赞扬 .NET 5,它应该(希望如此?)将此类功能带回现代 .NET 框架。
如何配置HttpClient对象以仅使用 .NET 5 中的 on-bord 方法为传出连接选择特定的本地 IP 地址?还是仍然不可能?附加问题:如何配置ClientWebSocket对象以仅使用 .NET 5 中的 on-bord 方法为传出连接选择特定的本地 IP 地址?
在我的设置中,计算机有多个 IP 地址,并且我正在访问的服务根据源 IP 地址有相当严格的速率限制。
请不要告诉我,操作系统会选择要使用的正确适配器或 IP 地址。请不要将我发送到第三方图书馆。是的,即使他们WebClient在这方面解决了我也不想使用它。
其他感兴趣的问题:
谁能解释一下请求标头和内容标头之间有什么区别?
在本例中,我讨论的是 UWPHttpClient对象。首先创建HttpClient,然后创建HttpRequestMessage,然后分配(在我的例子中分配HttpStreamContent给 HttpRequest 消息的 Content 属性)。上有 Headers 属性HttpRequestMessage, 上也有 Headers 属性HttpStreamContent。
我什么时候应该使用其中一种或另一种?
在一种或另一种情况下,标题到底会出现在哪里?
这是一个代码片段来解释我的意思
using(var objProtocolFilter = new HttpBaseProtocolFilter()) {
objProtocolFilter.AllowUI = false;
objProtocolFilter.CacheControl.ReadBehavior = HttpCacheReadBehavior.NoCache;
objProtocolFilter.CacheControl.WriteBehavior = HttpCacheWriteBehavior.NoCache;
using(var objClient = new HttpClient(objProtocolFilter)) {
HttpMethod eMethod = Method switch {
HttpUploadMethod.Post => HttpMethod.Post,
HttpUploadMethod.Put => HttpMethod.Put,
_ => throw new ValueOutOfRangeException(nameof(Method))
};
using(var objRequest = new HttpRequestMessage(eMethod, RemoteUri)) {
_Headers.Cast<string>().Execute(item => objRequest.Headers.TryAppendWithoutValidation(item, _Headers[item]));
objRequest.Content = new …Run Code Online (Sandbox Code Playgroud) 我在服务层有一个方法来连接到服务,并且我正在使用IHttpClientFactory. 我的方法运行良好。现在我正在尝试为此编写单元测试用例。
public async Task<MyObject> MyMethodAsync(string arg1, string arg2)
{
var client = _httpClientFactory.CreateClient("XYZ");
var Authkey = "abc";
var AuthToken = "def";
var headers = new Dictionary<string, string>
{
{ Authkey,AuthToken }
};
client.AddTokenToHeader(headers); //This method set the DefaultRequestheader from the dictionary object
var reqData = new
{
prop1 = "X",
prop2 = "Y"
};//req object
var content = new StringContent(JsonConvert.SerializeObject(reqData), Encoding.UTF8, "application/json");
//This is httpClient Post call for posting data
HttpResponseMessage response = await client.PostAsync("postData", content);
if …Run Code Online (Sandbox Code Playgroud) c# unit-testing dotnet-httpclient asp.net-core httpclientfactory
我们有一个 Web API (.NET Core 5),它将请求传递到另一个远程 Web API。
Web API 从传入请求中获取一些 cookie,并将它们附加到传出请求中。
通常情况下,这工作正常,我们会看到请求 cookie 到达远程 Web API。
但是,当同时发送多个请求时,一个传入请求的 cookie 会以某种方式泄漏到另一个请求的传出请求中。
当使用完全独立的用户和完全独立的浏览器时,甚至会发生这种情况。
我尝试过并确认过的事情:
将 cookie 从传入请求复制到传出请求的代码工作得很好。事实上,即使远程 API 上出现的 cookie 被“泄露”,我的自定义日志记录表明它仍然按预期工作
我可以在远程 Web API 上(在其原始 IIS 日志中)看到预期/泄漏的请求 cookie,因此不可能是远程 API 将其添加到其管道中的请求中。
添加了对 HttpClient 调用的日志记录,但看不到正在发送的意外 cookie。
这在本地不会发生
我的感觉是 HttpClient 中发生了一些事情?
更新 1我添加了日志记录CopyCookieHandler,它只创建一次并被所有请求重用
更新2我刚刚读到HttpMessageHandler实例导致CookieContainer对象被共享...这可能可以解释这一点... https://learn.microsoft.com/en-us/aspnet/core/fundamentals/http-requests?view=aspnetcore -5.0#cookies

第一个 API 具有使用 HttpClient 的设置:
services.AddHttpContextAccessor()
services.AddHttpClient<IRemoteService, RemoteService>()
.AddHttpMessageHandler<CopyCookieHandler>();
services.AddTransient<CopyCookieHandler>();
Run Code Online (Sandbox Code Playgroud)
在哪里
public class RemoteService : IRemoteService
{
private HttpClient …Run Code Online (Sandbox Code Playgroud) 我正在为下一个任务寻找最佳实践解决方案。
我使用 ASP.NET Core 6.0。
我创建了一个可与公共 API 配合使用的 SDK。SDK通过Http请求与API进行通信。我使用HttpClient类来发出 http 请求。
我的目标是构建一个 Nuget 包,以便消费者只需安装此 SDK 即可与公共 API 进行通信。
最后我们有两个项目:
问题:我必须在哪里实例化类的实例HttpClient?
我的想法:如果我在Sdk项目中这样做,并且只使用:
HttpClient client = new HttpClient();
Run Code Online (Sandbox Code Playgroud)
不是很好。因为通过创建 HttpClient 类的实例是不好的做法new()。请参阅
https://learn.microsoft.com/en-us/dotnet/fundamentals/networking/http/httpclient-guidelines
根据 MS 的此指南,我必须在消费者项目中通过 DI 启动此实例:
services.AddHttpClient();
Run Code Online (Sandbox Code Playgroud)
如果我选择此选项,我认为客户将很难注册我的 SDK,客户必须执行两个步骤:
HttpClient到DI容器中是否可以减少步骤并让我的库的使用变得更容易?
c# ×10
asp.net-core ×3
.net ×2
.net-5 ×1
.net-6.0 ×1
asp.net ×1
cookies ×1
credentials ×1
html ×1
http ×1
polly ×1
proxy ×1
request ×1
unit-testing ×1