2012-11-30 46 views
1

我生成一个URI如下之间的差异(此代码被简化并且伪造):URI .NET 2和4

Uri baseUri = "http://localhost/MyApp/Account/Login"; 
Uri fullUri = GetFullUri(baseUri, user); 

GetFullUri看起来像这样(这是在.NET 2组件):

public Uri GetFullUri(Uri baseUri, User user) 
{ 
    string token = GetTokenFromUser(user); //Implementation not important. 

    //Create a new URI based on the base URI, adding a query string. 
    return new Uri(baseUri, string.Format("?Token={0}", token)); 
} 

调用从.NET 4组件GetFullUri,结果是正确的,fullUri看起来像:

http://localhost/MyApp/Account/Login?Token=ABC123 

然后,我从.NET 2装配称为完全相同的代码,结果是不正确,fullUri样子:

http://localhost/MyApp/Account/?Token=ABC123 

通知的.NET 2的结果是如何丢失的第四和最后一节,“登陆” ?这是怎么回事?

+0

我怀疑,在.net 4中,uri重载构造函数或在构造函数实现中有更改。 – CodeSpread

回答

1

看起来像一个在.NET 4.0中修复的bug。尝试使用UriBuilder,它在两个工作:

public Uri GetFullUri(Uri baseUri, User user) 
{ 
    string token = GetTokenFromUser(user); //Implementation not important. 

    var builder = new UriBuilder(baseUri); 
    builder.Query = string.Format("Token={0}", token); 
    return builder.Uri; 
} 
+0

这有效。但是,从.NET 4调用时,该代码也可以正常工作(而在相同的2.0程序集中)。你能解释为什么会这样吗? –

+0

除非你跳过了大量的箍筋,否则加载到4.0'AppDomain'中的任何2.0程序集都将在4.0 CLR/BCL上运行。 –

+0

这很有趣,我之前没有想过。因此,无论框架的哪个版本调用它,都无法保证组件能够保持一致。 –