I have a problem with the .NET’s Uri implementation. It seems that if the scheme is ‘ftp’, the query part is not parsed as a Query, but as a part of the path instead.
Take the following code for example:
Uri testuri = new Uri('ftp://user:pass@localhost/?passive=true'); Console.WriteLine(testuri.Query); // Outputs an empty string Console.WriteLine(testuri.AbsolutePath); // Outputs '/%3Fpassive=true'
It seems to me that the Uri class wrongfully parses the query part as a part of the path. However changing the scheme to http, the result is as expected:
Uri testuri = new Uri('http://user:pass@localhost/?passive=true'); Console.WriteLine(testuri.Query); // Outputs '?passive=true' Console.WriteLine(testuri.AbsolutePath); // Outputs '/'
Does anyone have a solution to this, or know of an alternative Uri class that works as expected?
Well, the problem is not that I am unable to create a FTP connection, but that URI’s are not parsed accoding to RFC 2396.
What I actually intended to do was to create a Factory that provides implementations of a generic File transfer interface (containing get and put methods), based on a given connection URI. The URI defines the protocol, user info, host and path, and any properties needed to be passed should be passed through the Query part of the URI (such as the Passive mode option for the FTP connection).
However this proved difficult using the .NET Uri implementation, because it seems to parse the Query part of URI’s differently based on the schema.
So I was hoping that someone knew a workaround to this, or of an alternative to the seemingly broken .NET Uri implementation. Would be nice to know before spending hours implementing my own.