Как я могу использовать веб-сервис из приложения Silverlight?

#c# #silverlight #wcf

#c# #silverlight #wcf

Вопрос:

Я пытаюсь получить данные из веб-службы внутри приложения silverlight. К сожалению, приложение silverlight (приложение Bing map) просто зависает при попытке подключения.

Я использую тот же код в консольном приложении, и он работает просто отлично.

Есть ли что-то особенное, что мне нужно сделать в silverlight, чтобы заставить его работать? Я не получаю никаких исключений — он просто зависает.

Я основал свой сервис и клиентский код на этом примере http://www.switchonthecode.com/tutorials/wcf-tutorial-basic-interprocess-communication

Проблемы и вопросы:

1. Почему я не могу установить точки останова в своем коде sliverlight?

2. Как я могу успешно вызвать службу WCF из приложения silverlight?(ссылки на ПРОСТЫЕ рабочие примеры были бы великолепны — все те, которые я, кажется, нахожу, кажутся довольно продвинутыми (RIA, Duplex и т. Д.) Многие из них также показывают xml и другой «код», отличный от C # — честно говоря, я не знаю, что они делают и как они связаны с проектами,код и сервисы.

(Очевидно, я совершенно не разбираюсь в WCF и silverlight)

Согласно запросу кода:

 [ServiceContract]
public interface ILGSMapServer
{
    [OperationContract]
    List<double> GetLatitudes();
}    


public class TreeWorkClient
{ 
ChannelFactory<ILGSMapServer> httpServer;        
public ILGSMapServer httpProxy;        

public TreeWorkClient()
{
    httpServer = new ChannelFactory<ILGSMapServer>(new BasicHttpBinding(), new EndpointAddress("http://localhost:8000/GetLatitudes"));
    httpProxy = httpServer.CreateChannel();
}        

public List<TreeWorkItem> GetLocations()
{
    List<double> lats = httpProxy.GetLatitudes();


    //...  do stuff in code
    return ret;
}
  

}

Комментарии:

1. Пожалуйста, покажите код, который вы используете для вызова службы.

2. Уверен, что вам нужен AsyncPattern = true в вашем OperationContract для silverlight

3. @MerickOWA — Я понятия не имею, что это такое. Где / что это такое? Как мне его настроить?

4. @Tim Я опубликовал ответ, в котором показан пример того, что вам нужно изменить

Ответ №1:

Я согласен с Джоном Сондерсом — было бы проще ответить на этот вопрос, если бы вы опубликовали клиентский код.

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

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

Смотрите Это для деталей:

http://msdn.microsoft.com/en-us/library/cc197955 (v= против 95).aspx

Комментарии:

1. Я понятия не имею, что означает этот ответ. Все это на локальном компьютере — я просто пытаюсь протестировать прямо сейчас. Я ничего не знаю о конфигурации «Службы» / «Сервера» — я только что создал службу программно.

2. Ах, прости, Тим. Я не понимал, что все это локально. Я предполагаю, что служба находится в том же месте, откуда обслуживается приложение silverlight (localhost: 8000)?

3. Есть два разных решения / exes. Одно из них — это приложение, которое обслуживает WCF — и находится на localhost: 8000. другой — приложение silverlight bing map. localhost:56888/BingTestPage.aspx .

Ответ №2:

Учитывая ваш пример кода, вы должны видеть

Система.Исключение InvalidOperationException: контракт ‘ILGSMapServer’ содержит синхронные операции, которые не поддерживаются в Silverlight. Разделите операции на части «Begin» и «End» и установите для свойства AsyncPattern атрибута OperationContract значение «true». Обратите внимание, что вам не нужно вносить те же изменения на сервере.

Вам нужно будет изменить свой контракт на обслуживание следующим образом

   [ServiceContract]
  public interface ILGSMapServer {

    [OperationContract( AsyncPattern = true )]
    IAsyncResult BeginGetLatitudes( AsyncCallback callback, object context );
    List<double> EndGetLatitudes( IAsyncResult result );
    }
  

Это также означает, что вам нужно будет сделать что-то совершенно другое в вашей функции GetLocations(), поскольку эта функция вернется до того, как будут возвращены результаты из Интернета.

Попробуйте взглянуть на примеры здесь.

Другие варианты включают использование «Добавить ссылку на службу» вместо того, чтобы вручную определять ее в коде.

Комментарии:

1. Спасибо. Я вообще не вижу исключений. Я попытался перейти по этой ссылке / контенту. Я заблудился. Я дошел до изменения контракта на обслуживание в коде C #, но после этого я полностью потерян. Я думаю, мне просто нужно вернуться к программированию на C …

2. @Tim WCF — большой сложный, но очень гибкий зверь. Silverlight обеспечивает выполнение всех действий асинхронно. Вам не разрешается блокировать пользовательский интерфейс, пока WCF не извлекает данные. Я бы посоветовал изучить этот шаблон и понять, что он делает.

3. @MerrickOWA — спасибо — У меня нет проблем с потоковым или асинхронным поведением — проблема для меня в том, что .NET, c #, инструменты, WCF, Silverlight, интенсивное использование xml и т. Д. Для меня в новинку. Веб-сайты, которые я просматривал и читал, похоже, предполагают много знаний и опыта в тех самых вещах, с которыми я борюсь. Я действительно ценю помощь. Я близок к тому, чтобы заставить синхронизацию работать с моим кодом…

Ответ №3:

Я считаю, что вам нужно иметь этот атрибут в службе WCF, чтобы SL мог его использовать:

 [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
  

Что касается отладки — вы можете отлаживать Silverlight, попробуйте использовать для этого IE, его самый естественный браузер для отладки SL (к сожалению).

Как только вы начнете отладку, станет более ясно, что не так, когда вы поймаете междоменное исключение или какое-либо другое.