无法将 System.String 转换为 System.Uri。

23
我正在使用Web Client Class从互联网(实际上是Flickr)下载文件。当我使用WebClient().DownloadData(string) 时,它可以正常工作,但由于不是异步的,因此会锁定用户界面。
当我尝试使用WebClient().DownloadDatAsync(string)时,出现编译错误:"无法将System.String转换为System.Uri"。
字符串"MediumUrl"返回"http://farm4.static.flickr.com/2232/2232/someimage.jpg"
因此,问题是如何将字符串"http://farm4.static.flickr.com/2232/2232/someimage.jpg"转换为Uri。
我尝试过以下几种方法:
1. 我试图将其强制转换为Uri,但也不能正常工作。 2. 我尝试使用Uri myuri = new uri(string) - 结果与上述相同。
foreach (Photo photo in allphotos)  
{  
    //Console.WriteLine(String.Format("photo title is :{0}", photo.Title));
    objimage = new MemoryStream(wc.DownloadData(photo.MediumUrl));
    images.Add(new Pictures(new Bitmap(objimage), photo.MediumUrl, photo.Title));  
}

你正在使用哪个版本的.NET框架?是紧凑框架吗? - Mitch Wheat
@Dave Rook:要在列表中缩进代码,您需要将每行缩进8个空格。这是Markdown的一个怪癖。请参见http://meta.stackexchange.com/questions/3792/how-to-nest-code-within-a-list-using-markdown。 - BoltClock
@Dave Rook:您几周前编辑了这篇帖子并引起了我们的注意(这也是我能够联系到您的原因)。虽然有点延迟,但我还是想让您知道。 - BoltClock
5个回答

44

这个可以正常工作;

System.Uri uri = new System.Uri("http://farm4.static.flickr.com/2232/2232/someimage.jpg");

顺便提一下,我注意到你在表达式new uri(...)中将uri写成了小写。这不是你的问题,是吧?因为应该是"new Uri"。


我的代码中没有错别字,只是在这里打字时出现了一些问题。 此外,URL是在运行时动态生成的。 - dezkev

8

好的,我认为如果其他人在他们的代码中已经证明了你的URI是有效的并且编译等等,而你也提到它是在运行时生成的 - 这可能是你在运行时生成的UriString无效且不符合你的预期?

与其让一个异常被抛出来尝试从无效字符串创建Uri,我建议使用Uri类上的IsWellFormedUriString方法。

string uriString = "your_UriString_here";

if (Uri.IsWellFormedUriString(uriString, UriKind.Absolute))
{
    Uri uri = new Uri(uriString);
}
else
{
    Logger.WriteEvent("invalid uriString: " + uriString);
}

可能也有助于您的调试。

5
var yourUri = new UriBuilder(yourString).Uri;

所以你的例子将是:

因此,您的示例将是:

wc.DownloadDataAsync(new UriBuilder(photo.MediumUrl).Uri);
objimage = new MemoryStream(wc.Result);

你可能需要添加一个检查来确认操作已经完成。
希望这能有所帮助,

抱歉,不起作用;现在的错误如下: 无法解析构造函数:Memory Stream (void),可选项为: MemoryStream(byte[])(在类内存流中) memoryStream(int)(在类内存流中) - dezkev
公共 void DownloadDataAsync(System.Uri address) System.Net.WebClient 的成员 摘要: 将指定的资源下载为 System.Byte 数组。此方法不会阻塞调用线程。 参数: address:包含要下载的 URI 的 System.Uri。 - dezkev

5
objimage = new MemoryStream(wc.DownloadData(new Uri(photo.MediumUrl)));

b) 我尝试过 Uri myuri = new uri(string) - 但出现了以上错误。

这是从字符串创建 Uri 的常见方法... 如果字符串是一个有效的 URI,我不明白为什么它不能工作。


也尝试过了(抱歉之前没有提到)- 没有成功。编译错误。 - dezkev
这个错误可能是由我尝试的事情(b)中的打字错误引起的。我们无法确定。 - spender

0

如果我正确理解了你的代码,那么

wc.DownloadDataAsync(new Uri(photo.MediumUrl));

应该可以正常工作。


是的,我想使用异步方法,但由于字符串到Uri的转换问题,我无法这样做。上面的方法可以正常工作。 - dezkev

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接