我试图将客户端的数据下载到我的本地机器(以编程方式),并且他们的网络服务器非常非常慢,导致我的WebClient对象超时.
这是我的代码:
WebClient webClient = new WebClient();
webClient.Encoding = Encoding.UTF8;
webClient.DownloadFile(downloadUrl, downloadFile);
Run Code Online (Sandbox Code Playgroud)
有没有办法在这个对象上设置无限超时?或者,如果没有,任何人都可以用另一种方式帮助我做一个例子吗?
该URL在浏览器中正常工作 - 只需3分钟即可显示.
我们的网络应用程序在.Net Framework 4.0中运行.UI通过ajax调用调用控制器方法.
我们需要从供应商处使用REST服务.我正在评估在.Net 4.0中调用REST服务的最佳方法.REST服务需要基本身份验证方案,它可以返回XML和JSON中的数据.没有要求上传/下载大量数据,我将来也看不到任何东西.我看了几个用于REST消费的开源代码项目,并没有找到任何值来证明项目中的额外依赖性.开始评估WebClient和HttpClient.我从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中WebClient的HttpWebRequest类与.NET 之间有什么区别?他们都做了非常相似的事情.实际上,为什么不将它们合并到一个类中(太多的方法/变量等可能是一个原因,但.NET中有其他类违反了该规则).
谢谢.
我在ASP.NET中创建一个Web请求,我需要向主体添加一堆数据.我怎么做?
var request = HttpWebRequest.Create(targetURL);
request.Method = "PUT";
response = (HttpWebResponse)request.GetResponse();
Run Code Online (Sandbox Code Playgroud) 我有一些问题试图包装我的代码用于单元测试.问题是这样的.我有接口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#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文章都有帮助.
使用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) 使用C#和ASP.NET我想以编程方式在网页(表单)上填写一些值(4个文本框),然后'POST'这些值.我该怎么做呢?
编辑:澄清:有一项服务(www.stopforumspam.com),您可以在其"添加"页面上提交IP,用户名和电子邮件地址.我希望能够在我的网站页面上创建一个链接/按钮,用于填写这些值并提交信息,而无需复制/粘贴它们,然后单击提交按钮.
进一步澄清:自动垃圾邮件机器人如何填写表单并单击提交按钮(如果它们是用C#编写的)?
我使用下面的代码向服务器发送POST请求:
string url = "http://myserver/method?param1=1¶m2=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中)?
作为我正在开发的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
c# ×10
.net ×4
webclient ×3
.net-core ×1
asp.net ×1
asp.net-core ×1
async-await ×1
download ×1
file ×1
http ×1
httpclient ×1
moq ×1
parameters ×1
performance ×1
post ×1
rest ×1
unit-testing ×1