Как заставить относительный URI использовать https? - PullRequest
4 голосов
/ 10 сентября 2010

У меня есть относительный URI:

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

Проблема заключается в том, что в зависимости от того, набрал ли пользователь 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?

Ответы [ 4 ]

1 голос
/ 11 сентября 2010

Вместо этого вы должны изменить свой ASPX-файл, в котором размещается ваш silverlight, и заставить пользователя перенаправлять на SSL, только если он / она вошел в систему с использованием URL-адреса, отличного от SSL.Потому что в идеале было бы идеально, если silverlight открывает соединение только с тем же доменом и схемой, с которой он загружен.

1 голос
/ 11 сентября 2010

Относительный путь должен быть сначала преобразован в абсолютный. Я делаю это, используя Uri из файла XAP Silverlight.

Возможно, есть способы немного уменьшить это (кажется неправильным выполнение строковых операций с 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");

Это не включает передачу номера порта (что может потребоваться при других обстоятельствах). Лично я бы поместил приведенный выше код во вспомогательный метод, который также обрабатывает порт (и все, что вы хотите сделать по-другому при запуске localhost).

Надеюсь, это поможет.

0 голосов
/ 10 сентября 2010

«Схема» не имеет никакого значения в относительном URI. В какой-то момент вам придется преобразовать его в абсолютный URI, чтобы изменить схему.

0 голосов
/ 10 сентября 2010

Протокол является отдельным компонентом, поэтому я думаю, что вы можете просто поставить его перед своим относительным адресом:

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