标签: dotnet-httpclient

在 Windows Phone 8 中使用 HttpClient 执行 POST 时出现内部服务器错误

我以这种方式将字符串发布到网络服务器:

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

6
推荐指数
2
解决办法
3万
查看次数

HttpHeaders.TryAddWithoutValidation 是否验证?

我对这个函数的名称有点困惑。为什么不只是TryAdd呢?它没有验证什么?如果我使用这个函数,在某些情况下它还会抛出异常吗?我可以以某种方式“尝试添加”而不会出现任何异常,并且如果失败则仅返回 false 吗?

编辑:我认为这两个问题是相互矛盾的。如果我调用 with ,TryAddWithoutValidation它实际上会添加无效标头,还是如果它们无效则返回 false ?

.net c# http dotnet-httpclient

6
推荐指数
1
解决办法
4421
查看次数

HttpClient。在自动发现的代理上进行身份验证的默认凭据

控制狂免责声明:是的,关于 HttpClient 和代理有很多问题,但它们至少使用其中之一

  • 显式(非默认)代理凭据
  • 显式(非 WPAD)代理配置
  • 已弃用的 Api,例如 WebProxy.GetDefaultProxy、WebRequest 等。

根据dotnet 开发人员的说法

如果 HttpClientHandler.Proxy 默认值为 null,则 HttpClientHandler 将使用 IE 代理设置

因此,要使用 HttpClient 设置正确的公司代理,我们不需要任何其他操作,只需

_client = new HttpClient()
Run Code Online (Sandbox Code Playgroud)

并且没有官方方法来选择代理。但是我如何传递默认 AD 凭据以在自动发现的代理上进行身份验证呢?我刚刚收到“(407) 需要代理身份验证”。

PS 可能还有另一个问题,并且在特殊帐户下作为服务运行(尤其是在 Linux 上),此代码没有 IE 设置可供使用。所以我们需要重新实现WPAD。

.net c# proxy credentials dotnet-httpclient

6
推荐指数
1
解决办法
4867
查看次数

根据客户端不提供aspNetHidden div

我正在开发一个 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提供服务,哪些不提供服务?另外,我可以防止这种情况发生吗?

谢谢。

html c# asp.net dotnet-httpclient

6
推荐指数
1
解决办法
198
查看次数

注入的 HttpClient 忽略 IHttpClientFactory 配置

我创建了一个自定义库,它会自动为依赖于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)

注意:在这个测试项目中,我还添加了一个额外的模拟处理程序,因为我试图模拟 …

c# dependency-injection dotnet-httpclient polly

6
推荐指数
1
解决办法
1075
查看次数

如何将 HttpClient 绑定到 .NET 5 中的特定(源)IP 地址

根据问题 #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在这方面解决了我也不想使用它。

其他感兴趣的问题:

  • #23267 : HttpClient 指定要绑定到/发出请求的接口
  • #28721:在 SocketsHttpHandler (又名自定义拨号器)上添加 ConnectCallback

c# dotnet-httpclient .net-5

6
推荐指数
1
解决办法
5023
查看次数

HttpClient 的请求标头和内容标头有什么区别

谁能解释一下请求标头和内容标头之间有什么区别?

在本例中,我讨论的是 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)

c# request request-headers dotnet-httpclient

6
推荐指数
1
解决办法
3488
查看次数

如何编写单元测试用例IHttpClientFactory

我在服务层有一个方法来连接到服务,并且我正在使用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

6
推荐指数
1
解决办法
9492
查看次数

HttpClient 正在从其他请求的响应中发送请求 cookie

我们有一个 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)

c# cookies dotnet-httpclient asp.net-core

6
推荐指数
1
解决办法
3558
查看次数

在 NET 6.0 中使用 HttpClient 的最佳实践

我正在为下一个任务寻找最佳实践解决方案。

我使用 ASP.NET Core 6.0。

我创建了一个可与公共 API 配合使用的 SDK。SDK通过Http请求与API进行通信。我使用HttpClient类来发出 http 请求。

我的目标是构建一个 Nuget 包,以便消费者只需安装此 SDK 即可与公共 API 进行通信。

最后我们有两个项目:

  1. 消费项目
  2. SDK项目

问题:我必须在哪里实例化类的实例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,客户必须执行两个步骤:

  1. 注册HttpClient到DI容器中
  2. 在容器中注册SDK

是否可以减少步骤并让我的库的使用变得更容易?

c# system-design dotnet-httpclient asp.net-core .net-6.0

6
推荐指数
1
解决办法
6285
查看次数