Спасибо за все ответы, в конечном итоге использовать следующее:
try:
f = urllib2.urlopen(urllib2.Request(url))
deadLinkFound = False
except:
deadLinkFound = True
В других ответах объясняется, как этого избежать, но я подумал, что отвечу, почему это происходит: вы заканчиваете с отметкой порядка байтов перед фактическим содержанием .
Этого можно избежать, вызвав new UTF8Encoding (false)
вместо использования Encoding.UTF8
. Вот короткая программа, демонстрирующая разницу:
using System;
using System.Text;
using System.IO;
class Test
{
static void Main()
{
Encoding enc = new UTF8Encoding(false); // Prints 1 1
// Encoding enc = Encoding.UTF8; // Prints 1 4
string content = "x";
Console.WriteLine(enc.GetByteCount("x"));
MemoryStream ms = new MemoryStream();
StreamWriter sw = new StreamWriter(ms, enc);
sw.Write(content);
sw.Flush();
Console.WriteLine(ms.Length);
}
}
You need not set ContentLength explicitly, since it will be set automatically to the size of data written to request stream when you close it.
Maybe make like easier:
using(WebClient client = new WebClient()) {
NameValueCollection values = new NameValueCollection();
values.Add("id",Id);
byte[] resp = client.UploadValues("url","POST", values);
}
Or see here for a discussion allowing use like:
client.Post(destUri, new {
id = Id // other values here
});