2010-06-01 3 views
2

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

Итак, вот в чем проблема. Существует одно приложение 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(); следующее исключение встречается,.

Exception occured.

[EXCEPTION]
[TYPE:] 'InvalidOperationException'
[MESSAGE:] 'An error occurred while processing this request.'
[CALLSTACK:]
at System.Data.Services.Client.BaseAsyncResult.EndExecute[T](Object source, String method, IAsyncResult asyncResult)
at System.Data.Services.Client.QueryResult.EndExecute[TElement](Object source, IAsyncResult asyncResult)
at System.Data.Services.Client.DataServiceRequest.EndExecute[TElement](Object source, DataServiceContext context, IAsyncResult asyncResult)
at System.Data.Services.Client.DataServiceQuery`1.EndExecute(IAsyncResult asyncResult)
at SimpleGrid.SimpleGridVm.OnLoadDataFinished(IAsyncResult ar)

[INNEREXCEPTION]
[TYPE:] 'SecurityException'
[MESSAGE:] ''
[CALLSTACK:]
at System.Net.Browser.AsyncHelper.BeginOnUI(SendOrPostCallback beginMethod, Object state)
at System.Net.Browser.ClientHttpWebRequest.EndGetResponse(IAsyncResult asyncResult)
at System.Data.Services.Http.ClientHttpWebRequest.EndGetResponse(IAsyncResult asyncResult)
at System.Data.Services.Client.QueryResult.AsyncEndGetResponse(IAsyncResult asyncResult)

[INNEREXCEPTION]
[TYPE:] 'SecurityException'
[MESSAGE:] 'Security error.'
[CALLSTACK:]
at System.Net.Browser.ClientHttpWebRequest.InternalEndGetResponse(IAsyncResult asyncResult)
at System.Net.Browser.ClientHttpWebRequest.<>c__DisplayClass5.b__4(Object sendState)
at System.Net.Browser.AsyncHelper.<>c__DisplayClass2.b__0(Object sendState)
[/INNEREXCEPTION]
[/INNEREXCEPTION]
[/EXCEPTION]

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

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

С уважением

ответ

2

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

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

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


С уважением

0

Вы probarly должны начать Visual Studio как администратор

4

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

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

Вот Exemple из crossdomain файла политики, которые позволяют любой 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:

+0

Пожалуйста, прочитайте еще одну статью Silverlight 4: InvalidOperationException (SecurityException) WCF DataServices [Silverlight 4: InvalidOperationException (SecurityException) WCF DataServices] о '' – Jasper

1

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

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

Решение:

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

И работает служба RIA.

Смежные вопросы