SL 4 и WCF DataService: InvalidOperationException -> SecurityException - PullRequest
2 голосов
/ 01 июня 2010

вы будете думать: «Эта проблема решалась много, много раз. Так почему он не использует Google?» Пожалуйста, поверьте мне, я попробовал все. Я занимаюсь этой проблемой с прошлой недели. Я прочитал много блогов и искал MSDN. Но я не понимаю.

Так вот в чем проблема. Существует одно приложение Silverlight 4 и WCF DataService, оба работают на localhost.

Это код. Думаю, ничего особенного.

     private void InitializeData()
        {
            var query = (from item in ObjCtx.TestTgt
                             select item) as DataServiceQuery<TestTgt>;
            Debug.Assert(query != null, "'query' is null");

            query.BeginExecute(OnLoadDataFinished, query);
        }

        private void OnLoadDataFinished(IAsyncResult ar)
        {
            try
            {
                var query = ar.AsyncState as DataServiceQuery<TestTgt>;
                Debug.Assert(query != null, "'query' is null");

                var res = query.EndExecute(ar).ToList();
                Data.Data = new ObservableCollection<TestTgt>(res);
            }
            catch(Exception ex)
            {
                Data.StateDescription = String.Format("Exception occured.{0}{0}{1}", Environment.NewLine, AgExMsgFormatter.GetExText(ex));
            }
        }

В OnLoadData в этой строке: var res = query.EndExecute(ar).ToList(); возникает следующее исключение.

Исключение произошло.

[ИСКЛЮЧЕНИЯ]
[TYPE:] 'InvalidOperationException'
[MESSAGE:] 'Произошла ошибка при обработке этого запроса.'
[ЗВОНОК:]
в System.Data.Services.Client.BaseAsyncResult.EndExecute [T] (Источник объекта, метод String, IAsyncResult asyncResult)
в System.Data.Services.Client.QueryResult.EndExecute [TElement] (Источник объекта, IAsyncResult asyncResult)
в System.Data.Services.Client.DataServiceRequest.EndExecute [TElement] (Источник объекта, контекст DataServiceContext, IAsyncResult asyncResult)
в System.Data.Services.Client.DataServiceQuery`1.EndExecute (IAsyncResult asyncResult)
at SimpleGrid.SimpleGridVm.OnLoadDataFinished (IAsyncResult ar)

[InnerException]
[TYPE:] 'SecurityException'
[СООБЩЕНИЕ:] ''
[ЗВОНОК:]
в System.Net.Browser.AsyncHelper.BeginOnUI (SendOrPostCallback beginMethod, состояние объекта)
в System.Net.Browser.ClientHttpWebRequest.EndGetResponse (IAsyncResult asyncResult)
в System.Data.Services.Http.ClientHttpWebRequest.EndGetResponse (IAsyncResult asyncResult)
в System.Data.Services.Client.QueryResult.AsyncEndGetResponse (IAsyncResult asyncResult)

[InnerException]
[TYPE:] 'SecurityException'
[MESSAGE:] 'Ошибка безопасности.'
[ЗВОНОК:]
в System.Net.Browser.ClientHttpWebRequest.InternalEndGetResponse (IAsyncResult asyncResult)
в System.Net.Browser.ClientHttpWebRequest. <> c__DisplayClass5.b__4 (объект sendState)
в System.Net.Browser.AsyncHelper. <> c__DisplayClass2.b__0 (объект sendState)
[/ InnerException]
[/ InnerException] * * тысяча сорок семь [/ ИСКЛЮЧЕНИЕ]

В качестве режима аутентификации я хочу использовать Windows. Оба настроены для этого в IIS. Веб-сервис работает и доставляет правильные данные.

Так чего мне не хватает? Я думал, что это должно работать. Любая помощь будет оценена.

Привет

Ответы [ 4 ]

4 голосов
/ 08 октября 2010

Ваша проблема выглядит как междоменная ошибка: приложению silverlight не разрешено выполнять междоменные вызовы веб-службы по умолчанию. Это означает, что если ваше SL-приложение, размещенное на cassini (например, домен localhost: 4314), пытается получить доступ к службе WCF на локальном хосте домена, вызов завершится неудачей с исключением безопасности.

Вы можете легко выявить проблему, используя fiddler или вкладку сети firebug (в firefox): приложение сначала пытается получить доступ к файлу с именем «clientaccesspolicy.xml» в корневом каталоге домена веб-службы. Этот файл определяет политику на сервере WCF, которая разрешает междоменные вызовы на сервере.

Вот пример файла междоменной политики, который позволяет любым приложениям SL получать доступ к любым веб-сервисам в этом домене:

<?xml version="1.0" encoding="utf-8"?>
  <access-policy>
    <cross-domain-access>
      <policy>
        <allow-from http-request-headers="SOAPAction">
          <domain uri="*"/>
        </allow-from>
        <grant-to>
          <resource path="/" include-subpaths="true"/>
        </grant-to>
     </policy>
    <policy >
      <allow-from http-methods="*">
        <domain uri="*"/>
      </allow-from>
      <grant-to>
        <resource path="/" include-subpaths="true"/>
      </grant-to>
   </policy>
  </cross-domain-access>
</access-policy>

Однако Вы можете быть немного более конкретным. Более подробная информация доступна на MSDN :

2 голосов
/ 01 июня 2010

Хм, хорошо, это удивительно, но я понял. Проблема не в аутентификации или чем-то подобном. Это отладчик. Веб-сервис не размещен на веб-сайте приложения Silverlight. Таким образом, вызовы веб-службы не выполняются.

При загрузке развернутого сайта в браузере все работает отлично. Для меня это кажется чем-то странным, но, возможно, кто-то может дать мне хорошее объяснение этому поведению.

Но это поднимает еще одну проблему. Как отладить приложение Silverlight, когда оно ссылается на внешний веб-сервис. Возможно, я открою для этого отдельную ветку.


Привет

1 голос
/ 28 апреля 2011

Вот мое решение:

  1. Служба RIA работает, как вы сказали, на localhost.
  2. Ошибка возникает, когда проект Silverlight является проектом statup.
  3. Служба RIA в этом случае вызывается в контексте другого веб-страница.
  4. Visual Studio Debugger предупреждает об этом, но всплывающее окно часто выбрано «Не показывать».

Решение:

  1. Установите веб-проект в решении в качестве запускаемого проекта.
  2. Установить сгенерированный TestPage.html в качестве стартовой страницы.

И RIA Service работает.

0 голосов
/ 08 октября 2010

Вам, вероятно, нужно запустить Visual Studio от имени администратора

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...