如何强制使用https的相对URI?

4

我有一个相对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 方案更改为 https?


您的标题中不需要重复标签。我已经为您修复了这个问题。 - Robaticus
4个回答

1

相反,您应该更改托管Silverlight的ASPX文件,并强制用户在使用非SSL URL登录时重定向到SSL。因为理想情况下,Silverlight仅打开与其从中加载的同一域和方案的连接。


这并没有回答问题,但我认为这实际上是我要做的。谢谢。 - ForbesLindesay

1

相对路径必须先转换为绝对路径。我使用执行Silverlight XAP文件的Uri来完成这个操作。

可能有一些方法可以稍微减少这个过程(使用Uri进行字符串操作感觉不太对),但这是一个开始:

    // 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");

这并不包括传输端口号(在其他情况下可能需要)。个人建议将上述代码放入一个帮助方法中,该方法还处理端口(以及在运行本地主机时要执行的任何其他操作)。

希望这可以帮到你。


0

在相对URI中,“Scheme”没有任何意义。您需要将其转换为绝对URI,以更改方案。


0

协议是一个独立的组件,因此我认为您可以将其放在相对地址的前面:

Uri U = new Uri("https:../Services/Authenticated/VariationsService.svc", UriKind.Relative);

似乎无法工作: 无效的URI:无法解析授权/主机。 此错误在以下行处抛出: EndpointAddress address = new EndpointAddress(U, null); - ForbesLindesay
1
为什么不直接将整个URI字符串放入其中呢?https://www.mysite.org/Services/Authenticated/VariationsService.svc,或者我漏掉了什么吗? - Stryder
这不符合要求,因为如果域名更改,它会使项目变得不够灵活。 - ForbesLindesay

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接