我需要使用WebClient的"HTTP Post"将一些数据发布到我拥有的特定URL.
现在,我知道这可以通过WebRequest完成,但出于某些原因我想使用WebClient.那可能吗?如果是这样,有人能告诉我一些例子还是指向正确的方向?
我试图将客户端的数据下载到我的本地机器(以编程方式),并且他们的网络服务器非常非常慢,导致我的WebClient
对象超时.
这是我的代码:
WebClient webClient = new WebClient();
webClient.Encoding = Encoding.UTF8;
webClient.DownloadFile(downloadUrl, downloadFile);
Run Code Online (Sandbox Code Playgroud)
有没有办法在这个对象上设置无限超时?或者,如果没有,任何人都可以用另一种方式帮助我做一个例子吗?
该URL在浏览器中正常工作 - 只需3分钟即可显示.
当我尝试POST到URL时,会导致以下异常:
远程服务器返回错误:(417)期望失败.
这是一个示例代码:
var client = new WebClient();
var postData = new NameValueCollection();
postData.Add("postParamName", "postParamValue");
byte[] responseBytes = client.UploadValues("http://...", postData);
string response = Encoding.UTF8.GetString(responseBytes); // (417) Expectation Failed.
Run Code Online (Sandbox Code Playgroud)
使用一HttpWebRequest/HttpWebResponse
对或一HttpClient
对没有区别.
造成这种异常的原因是什么?
我们的网络应用程序在.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中有其他类违反了该规则).
谢谢.
我之前使用过带有HttpWebRequest和HttpWebResponse会话的CookieContainer,但现在,我想将它与WebClient一起使用.据我所知,没有像HttpWebRequests(request.CookieContainer
)那样的内置方法.如何从CookieContainer中的WebClient收集cookie?
public class CookieAwareWebClient : WebClient
{
private readonly CookieContainer m_container = new CookieContainer();
protected override WebRequest GetWebRequest(Uri address)
{
WebRequest request = base.GetWebRequest(address);
HttpWebRequest webRequest = request as HttpWebRequest;
if (webRequest != null)
{
webRequest.CookieContainer = m_container;
}
return request;
}
}
Run Code Online (Sandbox Code Playgroud)
这是最好的方法吗?
我正在将我的代码格式XML切换为JSON.
但我找不到如何从给定的URL获取JSON字符串.
URL是这样的:" https://api.facebook.com/method/fql.query?query=.....&format=json "
之前我使用过XDocuments,我可以使用load方法:
XDocument doc = XDocument.load("URL");
Run Code Online (Sandbox Code Playgroud)
这个JSON方法的等价物是什么?我正在使用JSON.NET.
在我看来,大部分可以完成的事情HttpWebRequest/Response
也可以在WebClient
课堂上完成.我读到的地方WebClient
是一个高级包装器WebRequest/Response
.
到目前为止,我无法看到任何无法实现的功能HttpWebRequest/Response
,也无法看到WebClient
HttpWebRequest/Response将为您提供更多"细粒度"控件.
我何时应该使用WebClient HttpWebRequest/Response
?何时?(显然,HttpWebRequest/Response
是HTTP特定的.)
如果HttpWebRequest/Response
是较低级别那么WebClient
,HttpWebRequest/Response
我能用不能实现的目标完成WebClient
什么?
我正在使用webClient.DownloadFile()
下载文件,我可以为此设置超时,这样如果它无法访问文件就不会花这么长时间吗?
那些"精细"的RFC要求每个RFC客户端都要求他们注意每个主机不要使用超过2个连接......
Microsoft在WebClient中实现了这一点.我知道它可以关闭
App.config中:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<system.net>
<connectionManagement>
<add address="*" maxconnection="100" />
</connectionManagement>
</system.net>
</configuration>
Run Code Online (Sandbox Code Playgroud)
但是我怎么能以编程方式呢?
遵守 http://msdn.microsoft.com/en-us/library/system.net.servicepointmanager.defaultconnectionlimit.aspx
"更改DefaultConnectionLimit属性对现有ServicePoint对象没有影响;它仅影响在更改后初始化的ServicePoint对象.如果未直接或通过配置设置此属性的值,则该值默认为常量DefaultPersistentConnectionLimit."
我最好在我实现WebClient时配置限制,但只是在我的程序开始时以编程方式删除这个可怕的限制也没关系.
我访问的服务器不是互联网上的常规网络服务器,而是在我的控制下和本地局域网中.我想做API调用,但我不使用webservices或remoting