Вопрос

Я разрабатываю приложение Silverlight 3, которое я хочу подключить к веб-сервису с помощью предоставленной библиотеки dll или с помощью SOAP.Но .библиотека DLL не подходит для Silverlight, поэтому я не могу этого сделать.И я не могу получить доступ к службе SOAP из-за междоменных проблем (я не размещаю ее, поэтому xml-файл clientpolicy не подойдет).

Итак, мое решение - включить .dll в веб-сервис с поддержкой WCF в моем собственном домене и позволить приложению Silverlight вызывать веб-сервис.Это работает.

Теперь перейдем к моей проблеме:Клиент, предоставленный из .библиотеки DLL, на которую ссылается мой веб-сервис, имеет метод .Connect (), поэтому я должен сохранить состояние объекта.Но могу ли я это сделать?Вероятно, не потому, что Silverlight не поддерживает wsHttpBinding.Я знаю, что могу получить доступ к переменным сеанса ASP, но могу ли я также сделать это вне браузера?Я могу найти только одно решение моей проблемы, и это сохранение имени пользователя / пароля в сеансе ASP и вызов метода .Connect () в каждом методе.Но это действительно плохое решение.

Идеи получше?


Я не думаю, что выразился ясно, и приношу свои извинения за это.Мой английский, собственно, и является основной причиной этого.

У меня есть:

Мое приложение Silverlight, которое работает на веб-сайте и вне браузера

Мой сервис WCF, который размещен в том же домене.

Междоменный веб-сервис (я не могу получить доступ к хранению файла междоменной политики)

Мой веб-сервис WCF обеспечивает связь между моим приложением и междоменным веб-сервисом, потому что вы не можете добавлять междоменные веб-сервисы без файла политики.

Мой веб-сервис выглядит примерно так (абстрактно):

class MyWebService
{
   CrossDomainWebServiceClient client = new CrossDomainWebServiceClient();

   public void Connect(string username, string password)
   {
      client.Connect(username, password);
   }

   public object Foo()
   {
      //GetEmployees() do only work if I'm connected
      return client.GetEmployees(); 
   }
}

Метод Foo() не работает, потому что это сеанс для каждого вызова, а не сеанс для каждого экземпляра.Я хочу, чтобы это сработало.Таким образом, клиентский объект необходимо сохранить для следующего вызова.Session.required не работает в Silverlight, потому что wsHttpBinding, по-видимому, не поддерживается.

Это было полезно?

Решение

Я не уверен на 100%, что понимаю вопрос, но у меня есть несколько схожая ситуация, с которой я работаю, и вот как мы справимся с этим.

<Ол>
  • Сторонний веб-сервис, который хранит все данные.
  • WCF среднего уровня, созданный нами для обработки всех взаимодействие с веб-сервисом.
  • Уровень клиента Silverlight, который подключается к нашей службе WCF.
  • Для аутентификации у нас есть метод аутентификации в нашей службе WCF, который затем вызывает веб-сервис и передает учетные данные, которые мы передали из Silverlight. Затем веб-служба отвечает маркером аутентификации, который мы установили в качестве файла cookie в запросе Silverlight. Таким образом, все будущие вызовы от Silverlight будут включать этот токен, который мы передаем при каждом обращении к веб-службе.

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

    Обновленный ответ

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

    [ServiceContract(Namespace = "")]
    [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
    public class ProxyService
    {
        private static Dictionary<Guid, DateTime> clients = new Dictionary<Guid, DateTime>();
    
        public ProxyService()
        {
    
        }
    
        [OperationContract]
        public void Login()
        {
            Guid id = Guid.NewGuid();
            // perform your login here
            clients.Add(id, DateTime.Now); // store your client instead of a date
            SetCookie(id);
        }
    
        [OperationContract]
        public DateTime Foo()
        {
            var id = ReadCookie();
            if (clients.ContainsKey(id))
            {
                return clients[id];
            }
            return DateTime.MinValue;
        }
    
        private void SetCookie(Guid id)
        {
            var cookie = new HttpCookie("id", id.ToString());
            cookie.Expires = DateTime.Now.AddMinutes(10);
            HttpContext.Current.Response.AppendCookie(cookie);
        }
    
        private Guid ReadCookie()
        {
            var cookie = HttpContext.Current.Request.Cookies.Get("id");
            if (cookie != null)
            {
                cookie.Expires = DateTime.Now.AddMinutes(10);
                return new Guid(cookie.Value);
            }
            return Guid.Empty;
        }
    }
    

    Конечно, вместо DateTime вы бы сохранили свой клиентский сервис. Теперь есть несколько проблем с этим подходом, которые вам все еще нужно решить.

    <Ол>
  • Тайм-ауты - вам нужен какой-то способ для тайм-аута неактивных сеансов и удаления их из списка клиентов.
  • Я не уверен, что это супер безопасный способ сделать что-то. Если кто-то получит ваш гид, он сможет получить доступ к вашим сотрудникам. Однако я не понимаю, как это произойдет, но я не эксперт по безопасности.
  • Вот и все, если у вас есть вопросы, дайте мне знать.

    Другие советы

    Если ваша dll не построена на время выполнения silverlight 3, вы не можете ссылаться на нее из своего проекта silverlight. Попросите вашего клиента перестроить DLL в этой среде выполнения.

    Silverlight строг, когда дело доходит до запуска кодов, которые требуют полного доверия. Если приложение silverlight не знает, в какое время находится dll, оно не примет его или вообще не вызовет.

    Обновить:

    Вы можете пометить свой сервис, чтобы сохранить объект сервиса в памяти на весь срок действия сеанса.

    [ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession)]
    class MyWebService{   
        CrossDomainWebServiceClient client = new CrossDomainWebServiceClient();   
    

    Это должно поддерживать инициализацию вашего междоменного клиента между вызовами.

    Оригинальный ответ:

    Объект Silverlight остается активным между вызовами, поэтому вы можете поддерживать состояние в памяти.

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

    Лицензировано под: CC-BY-SA с атрибуция
    Не связан с StackOverflow
    scroll top