无效的URI:无法确定URI的格式


115

我不断收到此错误。

无效的URI:无法确定URI的格式。

我的代码是:

Uri uri = new Uri(slct.Text);
if (DeleteFileOnServer(uri))
{
    nn.BalloonTipText = slct.Text + " has been deleted.";
    nn.ShowBalloonTip(30);
}

更新: slct.Text中的内容为ftp.jt-software.net/style.css

是什么赋予了?这怎么不是有效的URI格式?它是纯文本。


它告诉我slct.Text的内容不是有效的Uri。但它是。

1
@jts:也许您可以发布有问题的URI吗?
米奇·

使用新的Uri创建Uri或尝试删除服务器上的文件时,是否会出现异常?
西蒙

2
令人讨厌的uri是:ftp.jt-software.net/style.css

2
@jts,我认为那些反对意见来自发表评论的人,并发现您没有更新您的答案。请注意,您可以编辑问题以使其完整(并接受答案),以保持SO整洁。您丢失ftp://http://在URI中。您现在得到我的投票了;-)
亚伯

Answers:


126

为Uri使用其他构造函数可能会有所帮助。

如果您有服务器名称

string server = "http://www.myserver.com";

并有一个相对的Uri路径附加到它,例如

string relativePath = "sites/files/images/picture.png"

当从这两个创建一个Uri时,除非我将构造函数与UriKind参数一起使用,否则会出现“无法确定格式”异常,即

// this works, because the protocol is included in the string
Uri serverUri = new Uri(server);

// needs UriKind arg, or UriFormatException is thrown
Uri relativeUri = new Uri(relativePath, UriKind.Relative); 

// Uri(Uri, Uri) is the preferred constructor in this case
Uri fullUri = new Uri(serverUri, relativeUri);

59

在此处检查可能的原因:http : //msdn.microsoft.com/zh-cn/library/z6c2z492(v=VS.100).aspx

编辑:

您需要将协议前缀放在地址前面,即您的情况下为“ ftp://”


3
一点都没错。我真的很快地做了所有事情,然后我不小心地单击了向下按钮,它说除非问题被编辑,否则我无法撤消它,因此,如果您可以编辑您的问题或其他内容,我可以重新支持您:)关于这个问题:-(我不是要对你

投票支持而不是jts。由于后者消失了:)
安迪

1
@Simon,我刚刚再次投票赞成你,对不起您的延迟!你可以打我2次大声笑

13

听起来可能是一个现实的uri。跨浏览器Silverlight时遇到了这个问题。在我的博客上,我提到了一种解决方法:将“ context” uri作为第一个参数。

如果uri是现实的,则使用上下文uri创建完整的uri。如果uri是绝对的,则忽略上下文uri。

编辑:您在uri中需要一个“方案”,例如“ ftp://”或“ http://”


12

更好地使用Uri.IsWellFormedUriString(string uriString, UriKind uriKind)http://msdn.microsoft.com/zh-CN/library/system.uri.iswellformeduristring.aspx

例子:-

 if(Uri.IsWellFormedUriString(slct.Text,UriKind.Absolute))
 {
        Uri uri = new Uri(slct.Text);
        if (DeleteFileOnServer(uri))
        {
          nn.BalloonTipText = slct.Text + " has been deleted.";
          nn.ShowBalloonTip(30);
        }
 }

4
这没有提供解决方案。它只是检查URI是否正确,如果正确,它将继续。
亚历山德鲁·迪库

8

我通过使用UriBuilder来解决此问题。

UriBuilder builder = new UriBuilder(slct.Text);

if (DeleteFileOnServer(builder.Uri))
{
   ...
}

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.