我有一个相对URI:
Uri U = new Uri("../Services/Authenticated/VariationsService.svc",
UriKind.Relative);
问题在于,根据用户是否在其Web浏览器中键入https://或http://以访问silverlight应用程序,在尝试联系该服务时,它可能会使用http或https。
我想强制程序使用https连接到服务。
最初我试过这个:
Uri U = new Uri("../Services/Authenticated/VariationsService.svc",
UriKind.Relative);
string NU = U.AbsoluteUri;
U = new Uri(NU.Replace("http://", "https://"), UriKind.Absolute);
但它在U.AbsoluteUri失败,因为它无法在相位Uri转换为绝对的Uri。那么如何将Uri Scheme更改为https?
答案 0 :(得分:1)
必须先将相对路径转换为绝对路径。我使用激动人心的Silverlight XAP文件的Uri来做到这一点。
可能有一些方法可以减少这一点(使用Uris进行字符串操作感觉不对),但这是一个开始:
// Get the executing XAP Uri
var appUri = App.Current.Host.Source;
// Remove the XAP filename
var appPath = appUri.AbsolutePath.Substring(0, appUri.AbsolutePath.LastIndexOf('/'));
// Construct the required absolute path
var rootPath = string.Format("https://{0}{1}", appUri.DnsSafeHost, appUri.AbsolutePath);
// Make the relative target Uri absolute (relative to the target Uri)
var uri = new Uri(new Uri(rootPath), "../Services/Authenticated/VariationsService.svc");
这不包括转移portnumber(您可能希望在其他情况下执行此操作)。我个人会将上面的代码放在一个也处理端口的helper方法中(以及运行localhost时你想做的不同)。
希望这有帮助。
答案 1 :(得分:1)
相反,您应该更改托管Silverlight的ASPX文件,并强制用户只有在使用非SSL网址登录时才会重定向到SSL。因为理想情况下,如果silverlight仅打开与相同域和连接方案的连接,那将是完美的。
答案 2 :(得分:0)
协议是一个单独的组件,所以我认为你可以把它放在你的相对地址前面:
Uri U = new Uri("https:../Services/Authenticated/VariationsService.svc", UriKind.Relative);
答案 3 :(得分:0)
“Scheme”在相对URI中没有任何意义。您必须在某些时候将其转换为绝对URI以更改方案。