Как развернуть службу WCF с поддержкой Silverlight? - PullRequest
2 голосов
/ 10 августа 2011

Я программирую свое первое приложение Silverlight, и оно использует службу WCF с поддержкой Silverlight для извлечения и отправки данных на мой сервер.

Я создал приложение SL + веб-страницу ASP.NET MVC для размещения приложения SL.

В приложении MVC я создаю службу WCF и использую ее в приложении SL. Пока все хорошо.

Я развертываю проект с помощью веб-развертывания, и он работает на моем удаленном хосте, но с помощью Fiddler я понимаю, что удаленное приложение использует службу WCF, установленную на сервере разработки (AKA localhost: port).

Я изменил службу WCF в VS, и теперь она указывает на удаленный хост, и если я разверну решение, пока все хорошо.

Но вы знаете, теперь мой сервис указывает на удаленный сервер и не работает, потому что мне нужно создать xml для междоменного доступа (и fiddler говорит мне, что ищет domain.com/crossdomain.xml вместо domain .com / VirtualDirectory / crossdomain.xml).

Итак, мой вопрос: как я справлюсь с этим? Было бы хорошо, если бы мой проект использовал локальную службу, а при развертывании - удаленную.

Нужно ли делать это вручную или есть автоматический способ?

Спасибо.

Ответы [ 2 ]

2 голосов
/ 10 августа 2011

Адрес конечной точки включается в файл ServiceReferences.ClientConfig, который затем является частью файлов, встроенных в пакет XAP.Вы должны обновить этот файл при развертывании на работающем сервере.

Обходной путь - создать метод фабрики для класса прокси-клиента, который динамически создает адрес службы из адреса пакета Silverlight. Здесь - руководство, содержащее следующий код:

public class ServiceUtil {
    public static PeopleServiceClient GetPeopleServiceClient() {
        BasicHttpBinding binding = new BasicHttpBinding(
            Application.Current.Host.Source.Scheme.Equals("https", StringComparison.InvariantCultureIgnoreCase) 
            ? BasicHttpSecurityMode.Transport : BasicHttpSecurityMode.None);
        binding.MaxReceivedMessageSize = int.MaxValue;
        binding.MaxBufferSize = int.MaxValue;
        return new PeopleServiceClient(binding, new EndpointAddress(
            new Uri(Application.Current.Host.Source, "../PeopleService.svc")));
    }
}

Используя такую ​​фабрику, вы сможете развернуть свое приложение на любом сервере без перенастройки, если только Silverlight XAPФайл и сервис расположены одинаково относительно друг друга.

0 голосов
/ 10 августа 2011

Вы должны добавить файл clientaccesspolicy.xml в корень вашего сервера.См. Эту ссылку MSDN для получения дополнительной информации.Файл crossdomain.xml также можно использовать, но Microsoft поместила его туда из-за Flash, так как clientaccesspolicy.xml предпочтительнее, поскольку Silverlight поддерживает только подмножество crossdomain.xml.

Рекомендуется использовать службу localhost.пока вы не развернете.При развертывании вы можете изменить файл конфигурации или написать код для динамического поиска URL-адреса службы.В этом примере предполагается, что служба находится в том же URL-адресе, что и Silverlight XAP.

string serviceUrl = Application.Current.Host.Source.AbsoluteUri.Substring(0, Application.Current.Host.Source.AbsoluteUri.IndexOf("ClientBin/")) + "Services/DataService.svc"
...