2009-02-10 24 views
8

.NET'in Uri uygulamasında bir sorunum var. Şema "ftp" ise, sorgu kısmı bir Sorgu olarak değil, yolun bir parçası olarak ayrıştırılır..NET'in Uri uygulamasına alternatif mi?

örneğin aşağıdaki kodu atın:

Uri testuri = new Uri("ftp://user:[email protected]/?passive=true"); 
Console.WriteLine(testuri.Query); // Outputs an empty string 
Console.WriteLine(testuri.AbsolutePath); // Outputs "/%3Fpassive=true" 

O Uri sınıf haksız yere yolunun bir parçası olarak sorgu kısmını ayrıştırır geliyor bana. Ancak http düzenini değiştirerek, sonuç beklendiği gibi:

Uri testuri = new Uri("http://user:[email protected]/?passive=true"); 
Console.WriteLine(testuri.Query); // Outputs "?passive=true" 
Console.WriteLine(testuri.AbsolutePath); // Outputs "/" 

kimse buna bir çözüm varsa, ya beklendiği gibi çalıştığını alternatif Uri sınıfının biliyor mu?

cevap

4

Buradaki problem benim bir FTP bağlantısı oluşturmak mümkün olduğumu değil, URI en ayrıştırıldı Aslında yapmaya niyetli Ne RFC 2396.

doğrultusunda kapsamınızı olmadığını Belirli bir bağlantı URI'sine dayanan genel bir Dosya aktarım arabirimi (get ve put yöntemleri içeren) uygulamaları sağlayan bir Fabrika oluşturmaktı. URI, protokolü, kullanıcı bilgisini, ana bilgisayarı ve yolu tanımlar ve geçirilmesi gereken tüm özellikler URI'nin Sorgu bölümünden (FTP bağlantısı için Pasif mod seçeneği gibi) geçirilmelidir.

Ancak bu o farklı şema dayalı URI en Sorgu bölümünü ayrıştırmak gibi görünüyor, çünkü .NET Uri uygulamaları kullanan zor olduğunu kanıtladı.

Yani birisi veya görünüşte kırık .NET Uri uygulanmasına bir alternatif, buna bir çözüm bildiğini ümit oldu. Kendimi uygulayan saatler geçirmeden önce bilmek güzel olurdu.

1

Sen RequestUri gibi bir Uri özelliğine sahiptir FtpWebRequest gibi FTP protokolü için belirli bir sınıfı kullanmak zorunda.

Sen bence Uri çözümleyici için Thoses sınıflarında aramalıdır. Belirli bir nedeni yok zorunda kalmadıkça

2

Sen FtpWebRequest ve FtpWebResponse sınıfları kullanmalıdır.

FtpWebRequest.fwr = (FtpWebRequest)FtpWebRequest.Create(new Uri("ftp://uri")); 
fwr.ftpRequest.Method = WebRequestMethods.Ftp.UploadFile; 
fwr.ftpRequest.Credentials = new NetworkCredential("user", "pass"); 


FileInfo ff = new FileInfo("localpath"); 
byte[] fileContents = new byte[ff.Length]; 

using (FileStream fr = ff.OpenRead()) 
{ 
    fr.Read(fileContents, 0, Convert.ToInt32(ff.Length)); 
} 

using (Stream writer = fwr.GetRequestStream()) 
{ 
    writer.Write(fileContents, 0, fileContents.Length); 
} 

FtpWebResponse frp = (FtpWebResponse)fwr.GetResponse(); 
Response.Write(frp.ftpResponse.StatusDescription); 

Ref1Ref2

2

Bir süredir aynı sorunla uğraşıyorum. Mevcut UriParser'ı "ftp" şeması için UriParser.Register kullanarak değiştirmeye çalışmak, şema zaten kayıtlı olduğundan InvalidOperationException atar.

Ben ile geldi çözüm

o sorgu dizesini verir, böylece mevcut ftp ayrıştırıcı değiştirmek için yansıma kullanarak içerir. Bu, another UriParser bug için bir geçici çözüm temel alır. yerine Path arasında bir yerlerde sizin başlatma, ve ftp içinde Uris beklediğiniz gibi sorgu dizesi, Query parametre girecek olacak

MethodInfo getSyntax = typeof(UriParser).GetMethod("GetSyntax", System.Reflection.BindingFlags.Static 
                   | System.Reflection.BindingFlags.NonPublic); 
FieldInfo flagsField = typeof(UriParser).GetField("m_Flags", System.Reflection.BindingFlags.Instance 
                  | System.Reflection.BindingFlags.NonPublic); 
if (getSyntax != null && flagsField != null) 
{ 
    UriParser parser = (UriParser)getSyntax.Invoke(null, new object[] { "ftp"}); 
    if (parser != null) 
    { 
     int flagsValue = (int)flagsField.GetValue(parser); 

     // Set the MayHaveQuery attribute 
     int MayHaveQuery = 0x20; 
     if ((flagsValue & MayHaveQuery) == 0) flagsField.SetValue(parser, flagsValue | MayHaveQuery); 
    } 
} 

çalıştırın.