我有一个程序,我需要在外部sharepoint站点创建一些大量的文件夹(外部意思是我不能使用sharepoint对象模型).Web请求适用于此,但只需一次执行一个(发送请求,等待响应,重复)相当慢.我决定多线程化请求,尝试加快速度.该程序已大大加快,但经过一段时间(1-2分钟左右)后,并发异常开始被抛出.
代码在下面,这是最好的方法吗?
Semaphore Lock = new Semaphore(10, 10);
List<string> folderPathList = new List<string>();
//folderPathList populated
foreach (string folderPath in folderPathList)
{
Lock.WaitOne();
new Thread(delegate()
{
WebRequest request = WebRequest.Create(folderPath);
request.Credentials = DefaultCredentials;
request.Method = "MKCOL";
WebResponse response = request.GetResponse();
response.Close();
Lock.Release();
}).Start();
}
for(int i = 1;i <= 10;i++)
{
Lock.WaitOne();
}
Run Code Online (Sandbox Code Playgroud)
例外情况是这样的
未处理的异常:System.Net.WebException:无法连接到远程服务器---> System.Net.Sockets.SocketException:System.Net.Sockets通常只允许192.0.0.1:81使用每个套接字地址的一个用法
.
System.Net.SService.ConnectSocketInternal上的System.Net.Sockets.Socket.InternalConnect(EndPoint remoteEP)
中的Socket.DoConnect(EndPoint endPointSnapshot,SocketAddre ss socketAddress)(布尔值connectFailure,套接字s4,套接字s6,套接字和套接字,IPAddress和地址,ConnectSocketState state,IAsyncResult asyncResult,Int32 timeout,Exception&exception)
可能重复:
我怎样才能抓到404?
我想知道用c#asp.net捕获404错误的正确方法这里是我正在使用的代码
HttpWebRequest request = (HttpWebRequest) WebRequest.Create(String.Format("http://www.gravatar.com/avatar/{0}?d=404", hashe));
// execute the request
try
{
//TODO: test for good connectivity first
//So it will not update the whole database with bad avatars
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
Response.Write("has avatar");
}
catch (Exception ex)
{
if (ex.ToString().Contains("404"))
{
Response.Write("No avatar");
}
}
Run Code Online (Sandbox Code Playgroud)
这段代码有效,但我想知道这是否最有效.
我正在尝试使用vb.net中的webrequest类请求" http://www.google.com/?q=random " 这样的页面.我们在防火墙后面,所以我们必须验证我们的请求.我通过添加我的凭据已经通过了身份验证部分.但是一旦它起作用,它似乎进入了一个重定向循环.
有没有人有想法,评论,建议为什么这是?还有其他人遇到过这个问题吗?
Dim loHttp As HttpWebRequest = CType(WebRequest.Create(_url), HttpWebRequest)
loHttp.Timeout = 10000
loHttp.Method = "GET"
loHttp.KeepAlive = True
loHttp.AllowAutoRedirect = True
loHttp.PreAuthenticate = True
Dim _cred1 As NetworkCredential = ... //this is setup
//snip out this stuff
loHttp.Credentials = _cc
loWebResponse = loHttp.GetResponse()
Run Code Online (Sandbox Code Playgroud) 需要让服务器对API进行POST,如何将POST值添加到WebRequest对象以及如何发送它并获得响应(它将是一个字符串)?
我需要POST两个值,有时候更多,我在这些例子中看到它表示字符串postData ="要发布的字符串"; 但是我怎么让我发布的东西知道有多个表单值?
WebRequest request = HttpWebRequest.Create(url);
var credentialCache = new CredentialCache();
credentialCache.Add(
new Uri(url), // request url
"Digest", // authentication type
new NetworkCredential("user", "password") // credentials
);
request.Credentials = credentialCache;
Run Code Online (Sandbox Code Playgroud)
但是,这仅适用于没有URL参数的URL.例如,我可以下载http://example.com/test/xyz.html得很好,但是当我尝试下载时http://example.com/test?page=xyz,结果是400 Bad Request消息,服务器日志中包含以下内容(运行Apache 2.2):
Digest: uri mismatch - </test> does not match request-uri </test?page=xyz>
Run Code Online (Sandbox Code Playgroud)
我的第一个想法是摘要规范要求从摘要哈希中删除URL参数 - 但是从传递给的URL中删除参数credentialCache.Add()并没有改变事物.所以它必须是相反的方式,在.NET框架中的某个地方错误地从URL中删除参数.
这是我的要求:
var request = (HttpWebRequest) WebRequest.Create("https://mtgox.com/");
request.CookieContainer = new CookieContainer();
request.AllowAutoRedirect = false;
request.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8";
request.Headers[HttpRequestHeader.AcceptEncoding] = "gzip, deflate";
request.Headers[HttpRequestHeader.AcceptLanguage] = "en-gb,en;q=0.5";
request.Headers[HttpRequestHeader.AcceptCharset] = "ISO-8859-1,utf-8;q=0.7,*;q=0.7";
request.Timeout = 5000;
request.UserAgent = "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:2.0) Gecko/20100101 Firefox/4.0";
request.Method = "GET";
request.GetResponse();
Run Code Online (Sandbox Code Playgroud)
使用HttpFox从Firefox复制标题.我使用Fiddler2验证至少对于HTTP请求,标头在Firefox请求和我的请求之间是完全相同的.
但是,当使用HTTPS 对此特定网站执行请求时,请求会超时.它适用于其他网站.
我必须以不同的方式对Firefox执行,因为它始终适用于Firefox.但是,我无法使用Fiddler2调试它,因为每当Fiddler2转发这些请求时,它们也会超时,即使是由Firefox发起的.
它只是一个非常错误的网站吗?上面的哪一部分让我不喜欢Firefox?
我有一个C#应用程序,它使用本地库,使用UDP通过Internet将视频发送到其他IP.我对该库没有流量控制.
我的应用程序还调用另一台服务器的Web服务,使用WebRequest我可以控制它们.
问题是:
当我的互联网带宽较低时,视频流会占用我所有的带宽.因此,在此期间我无法获得我的Web服务方法的响应.
有没有办法优先考虑WebRequest或为他们节省一些带宽,以便我可以安全地获得响应?
使用WebRequest发送POST时,即使我手动设置了标头并将PreAuthenticate设置为true,也不会随请求一起发送Authorization标头,例如:
webRequest.Headers["Authorization"] = "OAuth oauth_consumer_key=bFPD...";
webRequest.PreAuthenticate = true;
Run Code Online (Sandbox Code Playgroud)
使用Fiddler我可以看到没有发送Authorization标头.目标站点(Twitter)返回400(错误请求)而不是401(未授权),因此WebRequest发送授权数据所需的错误挑战.有关信息,返回的内容是:
{"errors":[{"message":"Bad Authentication data","code":215}]}
Run Code Online (Sandbox Code Playgroud)
那么,我该如何解决这个问题呢?如何强制WebRequest在初始请求时发送授权?请注意,授权数据不是基本身份验证,而是OAuth字符串.
谢谢
我有以下功能来获取页面.我的问题是我想计算一下互联网连接的数量
入站(下载)和出站流量(已发送)
我怎样才能做到这一点 ?谢谢
我的功能
public static string func_fetch_Page(string srUrl, int irTimeOut = 60,
string srRequestUserAgent = "Mozilla/5.0 (Windows NT 6.3; WOW64; rv:31.0) Gecko/20100101 Firefox/31.0",
string srProxy = null)
{
string srBody = "";
string srResult = "";
try
{
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(srUrl);
request.Timeout = irTimeOut * 1000;
request.UserAgent = srRequestUserAgent;
request.KeepAlive = true;
request.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8";
WebHeaderCollection myWebHeaderCollection = request.Headers;
myWebHeaderCollection.Add("Accept-Language", "en-gb,en;q=0.5");
myWebHeaderCollection.Add("Accept-Encoding", "gzip, deflate");
request.AutomaticDecompression = DecompressionMethods.Deflate | DecompressionMethods.GZip;
using (WebResponse response = request.GetResponse())
{
using (Stream …Run Code Online (Sandbox Code Playgroud) 我正在重新审视我的旧代码,并且偶然发现了一种基于其网址获取网站标题的方法.这并不是你所谓的稳定方法,因为它经常无法产生结果,有时甚至会产生不正确的结果.此外,有时它无法显示标题中的某些字符,因为它们是替代编码.
有没有人对这个旧版本有改进建议?
public static string SuggestTitle(string url, int timeout)
{
WebResponse response = null;
string line = string.Empty;
try
{
WebRequest request = WebRequest.Create(url);
request.Timeout = timeout;
response = request.GetResponse();
Stream streamReceive = response.GetResponseStream();
Encoding encoding = System.Text.Encoding.GetEncoding("utf-8");
StreamReader streamRead = new System.IO.StreamReader(streamReceive, encoding);
while(streamRead.EndOfStream != true)
{
line = streamRead.ReadLine();
if (line.Contains("<title>"))
{
line = line.Split(new char[] { '<', '>' })[2];
break;
}
}
}
catch (Exception) { }
finally
{
if (response != null)
{
response.Close();
}
} …Run Code Online (Sandbox Code Playgroud)