相关疑难解决方法(0)

如何更改.NET WebClient对象的超时

我试图将客户端的数据下载到我的本地机器(以编程方式),并且他们的网络服务器非常非常慢,导致我的WebClient对象超时.

这是我的代码:

WebClient webClient = new WebClient();

webClient.Encoding = Encoding.UTF8;
webClient.DownloadFile(downloadUrl, downloadFile);
Run Code Online (Sandbox Code Playgroud)

有没有办法在这个对象上设置无限超时?或者,如果没有,任何人都可以用另一种方式帮助我做一个例子吗?

该URL在浏览器中正常工作 - 只需3分钟即可显示.

.net c# webclient file download

217
推荐指数
9
解决办法
16万
查看次数

在HttpClient和WebClient之间做出决定

我们的网络应用程序在.Net Framework 4.0中运行.UI通过ajax调用调用控制器方法.

我们需要从供应商处使用REST服务.我正在评估在.Net 4.0中调用REST服务的最佳方法.REST服务需要基本身份验证方案,它可以返回XML和JSON中的数据.没有要求上传/下载大量数据,我将来也看不到任何东西.我看了几个用于REST消费的开源代码项目,并没有找到任何值来证明项目中的额外依赖性.开始评估WebClientHttpClient.我从NuGet下载了用于.Net 4.0的HttpClient.

我搜索了WebClient和之间的差异,HttpClient并且该网站提到单个HttpClient可以处理并发调用,它可以重用已解析的DNS,cookie配置和身份验证.我还没有看到由于差异我们可能获得的实用价值.

我做了一个快速的性能测试,以找到WebClient(同步调用),HttpClient(同步和异步)如何执行.以下是结果:

HttpClient对所有请求使用相同的实例(min - max)

WebClient同步:8毫秒 - 167毫秒
HttpClient同步:3毫秒 - 7228毫秒
HttpClient异步:985 - 10405毫秒

HttpClient为每个请求使用new (min - max)

WebClient同步:4毫秒 - 297毫秒
HttpClient同步:3毫秒 - 7953毫秒
HttpClient异步:1027 - 10834毫秒

public class AHNData
{
    public int i;
    public string str;
}

public class Program
{
    public static HttpClient httpClient = new HttpClient();
    private static readonly string _url = "http://localhost:9000/api/values/";

    public …
Run Code Online (Sandbox Code Playgroud)

.net c# rest webclient dotnet-httpclient

204
推荐指数
6
解决办法
12万
查看次数

.NET中的WebClient和HTTPWebRequest类之间有什么区别?

.NET中WebClientHttpWebRequest类与.NET 之间有什么区别?他们都做了非常相似的事情.实际上,为什么不将它们合并到一个类中(太多的方法/变量等可能是一个原因,但.NET中有其他类违反了该规则).

谢谢.

.net c# webclient httpwebrequest

176
推荐指数
3
解决办法
17万
查看次数

设置WebRequest的正文数据

我在ASP.NET中创建一个Web请求,我需要向主体添加一堆数据.我怎么做?

var request = HttpWebRequest.Create(targetURL);
request.Method = "PUT";
response = (HttpWebResponse)request.GetResponse();
Run Code Online (Sandbox Code Playgroud)

c# httpwebrequest

115
推荐指数
3
解决办法
14万
查看次数

在单元测试中模拟HttpClient

我有一些问题试图包装我的代码用于单元测试.问题是这样的.我有接口IHttpHandler:

public interface IHttpHandler
{
    HttpClient client { get; }
}
Run Code Online (Sandbox Code Playgroud)

而使用它的类,HttpHandler:

public class HttpHandler : IHttpHandler
{
    public HttpClient client
    {
        get
        {
            return new HttpClient();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

然后是Connection类,它使用simpleIOC来注入客户端实现:

public class Connection
{
    private IHttpHandler _httpClient;

    public Connection(IHttpHandler httpClient)
    {
        _httpClient = httpClient;
    }
}
Run Code Online (Sandbox Code Playgroud)

然后我有一个单元测试项目,有这个类:

private IHttpHandler _httpClient;

[TestMethod]
public void TestMockConnection()
{
    var client = new Connection(_httpClient);

    client.doSomething();  

    // Here I want to somehow create a mock instance of the http client
    // Instead of the …
Run Code Online (Sandbox Code Playgroud)

c# unit-testing moq

90
推荐指数
15
解决办法
7万
查看次数

有人可以解释async/await吗?

我开始在C#5.0中学习async/await,我根本不理解它.我不明白它如何用于并行.我尝试了以下非常基本的程序:

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            Task task1 = Task1();
            Task task2 = Task2();

            Task.WaitAll(task1, task2);

            Debug.WriteLine("Finished main method");
        }

        public static async Task Task1()
        {
            await new Task(() => Thread.Sleep(TimeSpan.FromSeconds(5)));
            Debug.WriteLine("Finished Task1");
        }

        public static async Task Task2()
        {
            await new Task(() => Thread.Sleep(TimeSpan.FromSeconds(10)));
            Debug.WriteLine("Finished Task2");
        }

    }
}
Run Code Online (Sandbox Code Playgroud)

这个程序只是阻止呼叫Task.WaitAll(),永远不会完成.有人可以向我解释原因吗?我确信我只是缺少一些简单的东西,或者只是没有正确的心理模型,并且没有任何博客或MSDN文章都有帮助.

c# async-await

68
推荐指数
4
解决办法
4万
查看次数

System.Net.WebClient不合理地慢

使用System.Net.WebClient.DownloadData()方法时,我的响应时间非常慢.

在.NET中使用WebClient类获取URL时,在获得响应之前大约需要10秒,而我的浏览器在1秒内获取同一页面.这是因为数据大小为0.5kB或更小.

请求涉及POST/GET参数和用户代理标头(如果可能导致问题).

我还没有尝试过在.NET中下载数据的其他方法给我带来同样的问题,但我怀疑我可能得到类似的结果.(我一直觉得.NET中的Web请求非常慢......)

可能是什么原因造成的?

编辑:
我尝试System.Net.HttpWebRequest使用以下方法完成相应的操作,并且所有请求都在1秒内完成.

public static string DownloadText(string url)
        var request = (HttpWebRequest)WebRequest.Create(url);
        var response = (HttpWebResponse)request.GetResponse();

        using (var reader = new StreamReader(response.GetResponseStream()))
        {
            return reader.ReadToEnd();
        }
}
Run Code Online (Sandbox Code Playgroud)


虽然这个(旧)方法使用System.Net.WebClient每个请求完成需要15-30秒:

public static string DownloadText(string url)
{
       var client = new WebClient();
       byte[] data = client.DownloadData(url);
       return client.Encoding.GetString(data);
}
Run Code Online (Sandbox Code Playgroud)

.net c# performance http

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

你如何以编程方式填写表格并"发布"网页?

使用C#和ASP.NET我想以编程方式在网页(表单)上填写一些值(4个文本框),然后'POST'这些值.我该怎么做呢?

编辑:澄清:有一项服务(www.stopforumspam.com),您可以在其"添加"页面上提交IP,用户名和电子邮件地址.我希望能够在我的网站页面上创建一个链接/按钮,用于填写这些值并提交信息,而无需复制/粘贴它们,然后单击提交按钮.

进一步澄清:自动垃圾邮件机器人如何填写表单并单击提交按钮(如果它们是用C#编写的)?

c# asp.net

32
推荐指数
1
解决办法
10万
查看次数

C#:带有POST参数的HttpClient

我使用下面的代码向服务器发送POST请求:

string url = "http://myserver/method?param1=1&param2=2"    
HttpClientHandler handler = new HttpClientHandler();
HttpClient httpClient = new HttpClient(handler);
HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Post, url);
HttpResponseMessage response = await httpClient.SendAsync(request);
Run Code Online (Sandbox Code Playgroud)

我没有访问服务器进行调试,但我想知道,这个请求是以POST还是GET发送的?

如果是GET,如何更改我的代码以将param1和param2作为POST数据发送(不在URL中)?

c# parameters post httpclient

25
推荐指数
1
解决办法
8万
查看次数

使用特定的HttpMessageHandler注入单实例HttpClient

作为我正在开发的ASP.Net核心项目的一部分,我需要从WebApi中与许多不同的基于Rest的API端点进行通信.为了实现这一点,我使用了许多服务类,每个服务类都实例化一个静态HttpClient.基本上,我为WebApi连接的每个基于Rest的端点都有一个服务类.

HttpClient下面将看到如何在每个服务类中实例化静态的示例.

private static HttpClient _client = new HttpClient()
{
    BaseAddress = new Uri("http://endpointurlexample"),            
};
Run Code Online (Sandbox Code Playgroud)

虽然上述方法运行良好,但它不允许对正在使用的服务类进行有效的单元测试HttpClient.为了让我能够进行单元测试,我有一个假的HttpMessageHandler,我想HttpClient在我的单元测试中使用,虽然HttpClient实例化如上,但我不能将假的HttpMessageHandler作为我的单元测试的一部分.

HttpClient服务类在整个应用程序中保持单个实例(每个端点一个实例)的最佳方法是什么,但允许HttpMessageHandler在单元测试期间应用不同的实例?

我想到的一种方法是不使用静态字段来保存HttpClient服务类,而是允许使用单例生命周期通过构造函数注入来注入它,这将允许我在单元测试期间指定一个HttpClient所需的HttpMessageHandler,我想到的另一个选项是使用一个在静态字段HttpClient中实例化HttpClients 的工厂类,然后可以通过将HttpClient工厂注入服务类来检索,再次允许HttpMessageHandler在单元测试中返回相关的不同实现.以上都没有感到特别干净,感觉必须有更好的方法吗?

有任何问题,请告诉我.

c# dotnet-httpclient asp.net-core-mvc .net-core asp.net-core

15
推荐指数
2
解决办法
1万
查看次数