Проблема с доступом к службе вне браузера при использовании Silverlight 4

У меня есть приложение Silverlight 4, которое обращается к нескольким службам данных WCF.

Проблем с доступом к сервису через браузер нет.

Я настроил программу на запуск вне браузера с повышенным доверием. Затем я вижу вызовы службы WCF через скрипача, но ничего не возвращается.

Если я отлаживаю, я получаю следующую ошибку:

$exception  {System.UnauthorizedAccessException: Invalid cross-thread access.
   at MS.Internal.XcpImports.CheckThread()
   at System.Windows.Controls.ItemCollection.GetValueInternal(DependencyProperty dp)
   at System.Windows.PresentationFrameworkCollection`1.get_CountImpl()
   at System.Windows.PresentationFrameworkCollection`1.get_Count()
   at System.Windows.Controls.ItemContainerGenerator.System.Windows.Controls.Primitives.IItemContainerGenerator.RemoveAll()
   at System.Windows.Controls.ItemContainerGenerator.RemoveAll()
   at System.Windows.Controls.ItemContainerGenerator.OnRefresh()
   at System.Windows.Controls.ItemContainerGenerator.System.Windows.Controls.ICollectionChangedListener.OnCollectionChanged(Object sender, NotifyCollectionChangedEventArgs args)
   at System.Windows.Controls.WeakCollectionChangedListener.SourceCollectionChanged(Object sender, NotifyCollectionChangedEventArgs e)
   at System.Collections.Specialized.NotifyCollectionChangedEventHandler.Invoke(Object sender, NotifyCollectionChangedEventArgs e)
   at System.Windows.Controls.ItemCollection.NotifyCollectionChanged(NotifyCollectionChangedEventArgs e)
   at System.Windows.Controls.ItemCollection.System.Windows.Controls.ICollectionChangedListener.OnCollectionChanged(Object sender, NotifyCollectionChangedEventArgs e)
   at System.Windows.Controls.WeakCollectionChangedListener.SourceCollectionChanged(Object sender, NotifyCollectionChangedEventArgs e)
   at System.Collections.ObjectModel.ObservableCollection`1.OnCollectionChanged(NotifyCollectionChangedEventArgs e)
   at System.Collections.ObjectModel.ObservableCollection`1.ClearItems()
   at System.Collections.ObjectModel.Collection`1.Clear()
   at ClientFolderExplorer.ViewModels.DocumentExplorerViewModel.clientCatalog_ClientsLoadingComplete(Object sender, ClientLoadingEventArgs e)
   at ClientFolderExplorer.Catalogs.ClientCatalog.<>c__DisplayClass3.<ExecuteClientQuery>b__2(IAsyncResult a)}  System.Exception {System.UnauthorizedAccessException}

Не знаю, с чего начать устранение неполадок. У меня есть файлы crossdomain.xml и clientaccesspolicy.xml в корневом каталоге веб-сервера, но я даже не вижу, как эти файлы запрашиваются (в скрипаче).

Любые идеи?


person Dave Stringer    schedule 30.11.2010    source источник


Ответы (1)


Да, вы предполагаете, что проблема связана с межсайтовым доступом, а на самом деле она связана с доступом между потоками (первая строка ошибки ясно указывает на это).

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

Если это так, посмотрите, как использовать Dispatcher, чтобы вернуться к потоку пользовательского интерфейса.

person rawpower    schedule 30.11.2010
comment
Это не заходит так далеко, так как возникает ошибка загрузки данных. Мой метод обратного вызова использует диспетчер, но никогда не срабатывает. Еще раз, это происходит только из браузера, поэтому, если здесь нет каких-то дополнительных потоков, которые нужно учитывать, я все еще не понимаю, что вызывает проблему :-( - person Dave Stringer; 01.12.2010
comment
Я просто еще раз посмотрел на проблему. Поскольку вы используете OOB, я не понимаю, зачем SL вообще запрашивать междоменный файл, поскольку технически ваше приложение не происходит ни из одного домена. Таким образом, тот факт, что эти файлы не запрашиваются, является нормальным. Что также точно, так это то, что это проблема с перекрестными потоками. Глядя на стек вызовов, я вижу, что ObservableCollection изменяется, что, скорее всего, связано с пользовательским интерфейсом, что в конечном итоге приведет к сбою. Однако начало статистики вызовов не так читабельно, поскольку вы используете там анонимный метод. - person rawpower; 02.12.2010
comment
Если бы вы могли предоставить небольшой изолированный тестовый пример, было бы легче понять это. Попробуйте вырезать все, что не связано с рассматриваемой ошибкой, а затем опубликовать только проблемный код. - person rawpower; 02.12.2010
comment
Я понял..... Я использовал: Application.Current.RootVisual.Dispatcher.BeginInvoke(() =› { OnErrorLoading(e.Error); }); Что было хорошо в браузере, но не удалось вне браузера..... System.Windows.Deployment.Current.Dispatcher.BeginInvoke(() =› {...... Однако сработало. Спасибо, что указали мне правильное направление ! - person Dave Stringer; 03.12.2010
comment
Не совсем уверен, почему один только OOB провалился! - person Dave Stringer; 03.12.2010
comment
Привет, рад слышать, что ты решил эту проблему. Честно говоря, я озадачен тем, что существует (или кажется) два Диспетчера?!? В некоторых моих проектах с тех пор, как я перенес код из более старых версий .NET, мы использовали SynchronizationContext, поэтому я не могу сказать, что часто использовал Dispatcher. Я согласен с вами, что это странно. - person rawpower; 03.12.2010