URI không hợp lệ: Không thể xác định định dạng của URI


115

Tôi cứ bị lỗi này.

URI không hợp lệ: Không thể xác định định dạng của URI.

mã tôi có là:

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

Cập nhật: nội dung trong slct.Text là ftp.jt-software.net/style.css.

Đưa cái gì? Làm thế nào đó không phải là một định dạng URI hợp lệ? Đó là văn bản thuần túy.


Nó cho tôi biết nội dung của slct.Text không phải là Uri hợp lệ. Nhưng nó là.

1
@jts: bạn có thể đăng URI vi phạm không?
Mitch Wheat

Bạn có gặp ngoại lệ khi tạo Uri với Uri mới hoặc khi cố gắng xóa tệp trên máy chủ không?
Simon

2
Tiểu vi phạm là: ftp.jt-software.net/style.css

2
@jts, tôi cho rằng những phiếu phản đối đó đến từ những người đã để lại nhận xét và phát hiện ra rằng bạn đã không cập nhật câu trả lời của mình. Lưu ý, bạn có thể chỉnh sửa câu hỏi của mình để làm cho câu hỏi hoàn chỉnh (và chấp nhận câu trả lời), để giữ cho SO trong sạch. Bạn bị thiếu ftp://hoặc http://trong URI của mình. Bạn nhận được phiếu bầu của tôi ngay bây giờ ;-)
Abel

Câu trả lời:


126

Có thể hữu ích khi sử dụng một hàm tạo khác cho Uri.

Nếu bạn có tên máy chủ

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

và có một đường dẫn Uri tương đối để nối vào, ví dụ:

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

Khi tạo một Uri từ hai cái này, tôi nhận được ngoại lệ "không thể xác định được định dạng" trừ khi tôi sử dụng hàm tạo với đối số UriKind, tức là

// 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

Kiểm tra các lý do có thể xảy ra tại đây: http://msdn.microsoft.com/en-us/library/z6c2z492(v=VS.100).aspx

BIÊN TẬP:

Bạn cần đặt tiền tố giao thức trước địa chỉ, tức là trong trường hợp của bạn là "ftp: //"


3
Không có gì sai cả. Tôi đang làm mọi thứ rất nhanh, và tôi vô tình nhấp vào nút xuống và nó nói rằng trừ khi câu hỏi được chỉnh sửa, tôi không thể hoàn tác nó, vì vậy nếu bạn có thể vui lòng chỉnh sửa câu hỏi của mình hoặc điều gì đó, tôi có thể ủng hộ lại bạn :) Rất xin lỗi về điều đó :-( Tôi không có ý phản đối bạn

biểu quyết trở lại thay vì jts. Kể từ khi cái sau biến mất :)
Andy

1
@Simon, tôi vừa bình chọn bạn LÊN một lần nữa, xin lỗi vì sự chậm trễ LỚN! Bạn có thể đấm tôi 2times lol

13

Nghe có vẻ như đó có thể là một cơn tiểu thật. Tôi gặp sự cố này khi thực hiện Silverlight trên nhiều trình duyệt; trên blog của mình, tôi đã đề cập đến một cách giải quyết: chuyển một "ngữ cảnh" uri làm tham số đầu tiên.

Nếu đi tiểu là thật, tiểu cảnh được sử dụng để tạo ra một lần đi tiểu đầy đủ. Nếu tiểu là tuyệt đối, thì tiểu cảnh sẽ bị bỏ qua.

CHỈNH SỬA: Bạn cần một "lược đồ" trong tiểu, ví dụ: "ftp: //" hoặc "http: //"


12

Sử dụng tốt hơn Uri.IsWellFormedUriString(string uriString, UriKind uriKind). http://msdn.microsoft.com/en-us/library/system.uri.iswellformeduristring.aspx

Thí dụ :-

 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
Điều này không cung cấp một giải pháp. Nó chỉ kiểm tra xem URI có đúng không và nếu có, nó sẽ tiếp tục.
Alexandru Dicu

8

Tôi đã giải quyết vấn đề này bằng cách sử dụng UriBuilder thay thế.

UriBuilder builder = new UriBuilder(slct.Text);

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

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.