我在源代码中使用Web客户端类来使用http下载字符串.
这工作正常.但是,公司中的客户端现在都连接到代理服务器.而问题始于此.
当我测试我的应用程序时,我不认为它可以通过代理服务器,因为不断抛出的异常是"没有来自xxx.xxx.xxx.xxx的响应,这是代理服务器的IP地址.
但是,我仍然可以导航到网站URL,它在通过代理服务器连接时在浏览器中正确显示字符串,但在我使用我的Web客户端时却没有.
我必须配置Web客户端中的某些内容以允许我从代理服务器后面访问URL吗?
using (WebClient wc = new WebClient())
{
string strURL = "http://xxxxxxxxxxxxxxxxxxxxxxxx";
//Download only when the webclient is not busy.
if (!wc.IsBusy)
{
string rtn_msg = string.Empty;
try
{
rtn_msg = wc.DownloadString(new Uri(strURL));
return rtn_msg;
}
catch (WebException ex)
{
Console.Write(ex.Message);
return false;
}
catch (Exception ex)
{
Console.Write(ex.Message);
return false;
}
}
else
{
System.Windows.Forms.MessageBox.Show("Busy please try again");
return false;
}
}
Run Code Online (Sandbox Code Playgroud) 我正在使用webclient调用我网站上的页面.我正在尝试将网页的结果放入pdf中,因此我尝试获取呈现页面的字符串表示形式.问题是请求未经过身份验证,因此我得到的只是一个登录屏幕.我已将UseDefaultCredentials属性发送到true,但我仍然得到相同的结果.以下是我的代码的一部分:
WebClient webClient = new WebClient();
webClient.Encoding = Encoding.UTF8;
webClient.UseDefaultCredentials = true;
return Encoding.UTF8.GetString(webClient.UploadValues(link, "POST",form));
Run Code Online (Sandbox Code Playgroud) 如何在webClient
课堂上设置标题?我试过了:
client.Headers["Content-Type"] = "image/jpeg";
Run Code Online (Sandbox Code Playgroud)
抛出一个 WebException
我的代码:
WebClient client = new WebClient();
client.Headers.Set("Content-Type", "image/png");
client.Headers.Set("Content-Length", length);
client.Headers.Add("Slug", name);
NameValueCollection nvc = new NameValueCollection();
nvc.Add("file", FileContents);
Byte[] data = client.UploadValues(url, nvc);
string res = Encoding.ASCII.GetString(data);
Response.Write(res);
Run Code Online (Sandbox Code Playgroud) 我在Windows服务中运行以下代码:
WebClient webClient = new WebClient();
webClient.Credentials = new NetworkCredential("me", "12345", "evilcorp.com");
webClient.DownloadFile(downloadUrl, filePath);
Run Code Online (Sandbox Code Playgroud)
每次,我都会得到以下异常
{"The remote server returned an error: (401) Unauthorized."}
Run Code Online (Sandbox Code Playgroud)
具有以下内部异常:
{"The function requested is not supported"}
Run Code Online (Sandbox Code Playgroud)
我知道凭证是有效的,事实上,如果我在我的网络浏览器中下载urrl并输入我的凭据evilcorp.com\me,密码为12345,则下载正常.
但奇怪的是,如果我将我的凭证指定为me@evilcorp.com并且12345,则它似乎失败了.
有没有办法格式化凭据?
是否可以使用System.Net.WebClient发送带有一些表单数据的HTTP POST?
如果没有,是否有另一个像WebClient这样的库可以进行HTTP POST?我知道我可以使用System.Net.HttpWebRequest,但我正在寻找一些不那么冗长的东西.
希望它看起来像这样:
Using client As New TheHTTPLib
client.FormData("parm1") = "somevalue"
result = client.DownloadString(someurl, Method.POST)
End Using
Run Code Online (Sandbox Code Playgroud) 我正在使用WebClient.UploadData()
Java服务器上的帖子.我该如何延长时间限制?(每次我尝试进行一些调试时都会超时)
我想在C#中使用WebClient对象下载一些东西,但是下载域要求我登录.如何使用WebClient登录并保存会话数据?我知道如何使用WebClient发布数据.
我正在使用以下代码在本地机器上工作,但当我在服务器上尝试相同的代码时,它会抛出我的错误
连接尝试失败,因为连接方在一段时间后没有正确响应,或者建立的连接失败,因为连接的主机无法响应
这是我的代码:
WebClient client = new WebClient();
// Add a user agent header in case the
// requested URI contains a query.
//client.Headers.Add ("ID", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; .NET CLR 1.0.3705;)");
Stream data = client.OpenRead("http://" + Request.ServerVariables["HTTP_HOST"] + Request.ApplicationPath + "/PageDetails.aspx?ModuleID=" + ID);
StreamReader reader = new StreamReader(data);
string s = reader.ReadToEnd();
Console.WriteLine(s);
data.Close();
reader.Close();
Run Code Online (Sandbox Code Playgroud)
我收到了错误
Stream data = client.OpenRead("http://" + Request.ServerVariables["HTTP_HOST"] + Request.ApplicationPath + "/PageDetails.aspx?ModuleID=" + ID);
Run Code Online (Sandbox Code Playgroud)
是因为任何防火墙设置?
我正在开发一个在两个后端服务器之间使用一些HTTP通信的项目.服务器使用X509证书进行身份验证.不用说,当服务器A(客户端)建立与服务器B(服务器)的连接时,存在SSL/TLS验证错误,因为使用的证书不是来自受信任的第三方权限.
通常,处理它的方法是使用ServicePointManager.ServerCertificateValidationCallback
,例如:
ServicePointManager.ServerCertificateValidationCallback +=
(sender, cert, chain, error) =>
{
return cert.GetCertHashString() == "xxxxxxxxxxxxxxxx";
};
Run Code Online (Sandbox Code Playgroud)
这种方法有效,除非它不理想.它本质上做的是覆盖应用程序完成的每个http请求的验证过程.因此,如果另一个类将尝试运行HTTP请求,它将失败.此外,如果另一个类ServicePointManager.ServerCertificateValidationCallback
为了自己的目的而覆盖,那么我的通信开始突然失败.
想到的唯一解决方案是创建一个单独的AppDomain来执行客户端HTTP请求.这可行,但实际上 - 只有这样才能执行HTTP请求是愚蠢的.开销将是惊人的.
考虑到这一点,是否有人研究过.NET中是否有更好的实践,这将允许访问Web服务,同时处理客户端SSL/TLS验证而不影响其他Web客户端?
美好的一天.
我WebClient
在我的C#应用程序中使用该类以便每分钟下载相同的文件,然后应用程序执行简单的检查以查看文件是否已更改,以及它是否确实对其执行了操作.
好吧,因为这个文件每分钟下载一次,WebClient
缓存系统都会缓存文件,而不是再次下载文件,只是简单地从缓存中获取文件,这样就会检查下载的文件是否是新文件.
所以我想知道如何禁用WebClient
该类的缓存系统.
我试过了.
Client.CachePolicy = new System.Net.Cache.RequestCachePolicy(System.Net.Cache.RequestCacheLevel.BypassCache);
Run Code Online (Sandbox Code Playgroud)
我也试过标题.
WebClient.Headers.Add("Cache-Control", "no-cache");
Run Code Online (Sandbox Code Playgroud)
没有工作.那我怎么能禁用缓存呢?
谢谢.
编辑
我也试过以下CacheLevels
:NoCacheNoStore
,BypassCache
,Reload
.没有效果,但是如果我重新启动计算机,缓存似乎被清除,但我不能每次都重新启动计算机.
面对最近的活动更新(8集2012)
标记为已接受的答案解决了我的问题.简单来说,我使用套接字下载文件,这解决了我的问题.基本上是对所需文件的GET请求,我不会详细介绍如何操作,因为我确信你可以在SO上找到大量的"如何",以便自己做同样的事情.虽然这并不意味着我的解决方案对你来说也是最好的,但我的第一个建议是阅读其他答案,看看是否有用.
好吧无论如何,因为这个问题已经看到了最近的一些活动,我想添加这个更新,以包括一些暗示或想法,我认为应该考虑那些面临类似问题的人,他们尝试了他们可以想到的一切,并且确定问题没有撒谎他们的代码.可能是大多数情况下的代码,但有时候我们只是不太看到它,只需要散步几分钟后再回来,你可能会看到它是空白范围,就像它是最明显的一样.第一名.
无论哪种方式,如果您确定,那么在这种情况下,我建议检查天气您的请求通过其他具有缓存功能的设备(计算机,路由器,代理,...),直到它到达预定目的地.
考虑到大多数请求都通过之前提到的一些此类设备,更常见的是路由器,除非您通过服务提供商网络直接连接到Internet.
有一段时间我自己的路由器正在缓存文件,奇怪我知道,但事实就是如此,每当我重新启动它或直接连接到Internet时,我的缓存问题就消失了.并且没有任何其他设备连接到路由器可以被指责,只有计算机和路由器.
顺便说一句,一般建议,虽然它主要适用于那些在公司开发计算机而不是自己的计算机上工作的人.可以通过任何更改您的开发计算机运行各种缓存服务?有可能的.
此外,考虑到许多高端网站或服务使用内容交付网络(CDN),并且根据CDN提供商,无论何时更新或更改文件,这些更改都需要一些时间才能反映在整个网络中.因此,您可能有可能要求提供可能处于更新中间的文件,并且最近的CDN服务器尚未完成更新.
在任何情况下,特别是如果您总是一遍又一遍地请求相同的文件,或者如果您找不到问题所在,那么如果可能的话,我建议您重新考虑一次又一次请求同一文件的方法,并且而是考虑构建一个简单的Web服务,以满足您首先考虑满足此类文件的需求.
如果您正在考虑这样的选项,我想您可能会更容易根据自己的需要构建REST样式Web API.
我希望这个更新在某种程度上对你有用,肯定会在我回来的时候.祝您的编码工作顺利.