Самостоятельные службы данных ADO.NET, получаемые из внешнего приложения Silverlight

Проблема:

Существует проблема, из-за которой я не могу получить доступ к своим автономным службам данных ADO.NET из моих приложений RIA.

Мои службы размещаются отдельно от веб-проектов с помощью Rich Internet Applications (RIA) s.

Мне нужно разрешить доступ из отдельных клиентских приложений Silverlight (и Flash).

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

System.InvalidOperationException: ошибка при сохранении изменений. Подробнее см. Внутреннее исключение. ---> System.Data.Services.Http.WebException: внутренняя ошибка в HttpWebResponse.NormalizeResponseStatus. в System.Data.Services.Http.HttpWebResponse.NormalizeResponseStatus (Int32 и statusCode) в System.Data.Services.Http.HttpWebResponse..ctor (запрос HttpWebRequest, Int32 statusCode, String responseHeaders) в System.DataPRequest.Headers.HttpWebRequest. CreateResponse () в System.Data.Services.Http.HttpWebRequest.EndGetResponse (IAsyncResult asyncResult) в System.Data.Services.Client.QueryAsyncResult.AsyncEndGetResponse (IAsyncResult trace --- исключение EndResult в качестве внутреннего исключения System. Data.Services.Client.BaseAsyncResult.EndExecute [T] (источник объекта, метод String, IAsyncResult asyncResult) в System.Data.Services.Client.QueryAsyncResult.EndExecute [TElement] (источник объекта, IAsyncResult asyncRataesulter). .Client.DataServiceQuery`1.EndExecute (IAsyncResult asyncResult) в Curo.Silverlight.MainPage. ‹> C__DisplayClass1.‹. Ctor> b__0 (IAsyncResult ar) в System.Data.Services.Client.BaseAsyncRespleted () t System.Data.Services.Client.QueryAsyncResult.AsyncEndGetResponse (IAsyncResult asyncResult) в System.Data.Services.Http.HttpWebRequest.ReadyStateChanged () System.Data.Services.Http.WebExceptionResponse. в System.Data.Services.Http.HttpWebResponse.NormalizeResponseStatus (Int32 и statusCode) в System.Data.Services.Http.HttpWebResponse..ctor (запрос HttpWebRequest, Int32 statusCode, String responseHeaders) в System.DataPRequest.Headers.HttpWebRequest. CreateResponse () в System.Data.Services.Http.HttpWebRequest.EndGetResponse (IAsyncResult asyncResult) в System.Data.Services.Client.QueryAsyncResult.AsyncEndGetResponse (IAsyncResult)Result

Примечания:

Из того, что я прочитал, похоже, что междоменный доступ запрещен в отношении служб данных ADO.NET, что может привести к тому, что мне придется использовать другой подход к доступу к данным, например. используя чистую структуру REST ..?

«Проблема междоменных служб данных ADO.NET сложнее, чем кажется, и до сих пор не решена. Я уже некоторое время обсуждал ее с Microsoft, и причина того, что она не работает, связана с ее используя транспорт на уровне браузера, и этот транспорт не допускает межсайтовых сценариев ".

См .: http://forums.silverlight.net/forums/p/70925/170703.aspx#170703

Я понимаю, что мне может потребоваться открыть файл ClientAccessPolicy.xml, который будет определять правила доступа, ограничивая при этом межсайтовый скриптинг.

Также стоит отметить, что приложения RIA будут работать в одной локальной сети.

Вопросы:

Есть ли у меня жизнеспособные средства доступа к службам моих клиентов RIA, учитывая, что они будут работать за одним и тем же брандмауэром? Если да, то как?

Как точно открыть ClientAccessPolicy.xml из автономной службы данных ADO.NET?

Как вы порекомендуете действовать, чтобы разрешить внешний доступ к моим услугам? - Другой REST Framework? - Услуги хоста в рамках одного и того же веб-проекта за счет разделения? - Любой другой совет ...

Спасибо.


person Community    schedule 15.10.2009    source источник


Ответы (2)


Я не уверен, что понимаю всю глубину вашей проблемы, но, по крайней мере, я хотел бы убедиться, что у меня есть файл clientaccesspolicy.xml и файл crossdomain.xml в корневой папке службы . Важно, чтобы файлы политики xml находились в корневой папке домена. Например, если ваша служба размещена на mycompany.com/services, файлы xml должны находиться в папке mycompany.com, а не в папке служб.

Вот пример ClientAccessPolicy.xml:

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

А вот пример crossdomain.xml:

<?xml version="1.0"?>
<!DOCTYPE cross-domain-policy SYSTEM "http://www.macromedia.com/xml/dtds/cross-domain-policy.dtd">
<cross-domain-policy>
    <allow-http-request-headers-from domain="*" headers="*" />
</cross-domain-policy>

Я бы рекомендовал использовать оба файла как для flash, так и для silverlight. Оба файла, указанные выше, разрешат открытый доступ для всех приложений flash и silverlight, но это не должно быть проблемой, если вы находитесь за брандмауэром.

У меня была точно такая же проблема в одном из моих приложений silverlight за брандмауэром, и размещение этих файлов, казалось, решило проблему. Я бы начал с этих файлов и пошел дальше.

person Community    schedule 15.10.2009
comment
Как точно открыть ClientAccessPolicy.xml из автономной службы данных ADO.NET? - person holsee; 19.10.2009
comment
Извините, я пропустил ваш ответ. Создайте файл с именем ClientAccessPolicy.xml точно так же, как тот, который я описал выше. Если хотите, скопируйте пасту сверху. Вам нужно перейти в корневую папку, в которой размещен ваш сервис. Например, если ваша служба размещена на myPC.myCompany.com/Services/myservice, вам нужно перетащить XML-файл в папку myPC.myCompany.com. Вот где silverlight будет искать файл. - person Ben McCormack; 30.10.2009
comment
Однако, прочитав ваш пост выше, все может быть сложнее. Все, что я знаю на данном этапе, - это сказать вам, куда поместить XML-файл. - person Ben McCormack; 30.10.2009
comment
Спасибо, что ответили мне. Я открыл файлы политик с помощью вызова службы [WebGet], поскольку служба данных размещается на собственном хостинге. Похоже, что нет способа раскрыть ADO.NET DataServices Cross Domain. - person holsee; 18.11.2009

«Проблема междоменных служб данных ADO.NET сложнее, чем кажется, и до сих пор не решена. Я уже некоторое время обсуждал ее с Microsoft, и причина того, что она не работает, связана с ее используя транспорт на уровне браузера, и этот транспорт не допускает межсайтовых сценариев ".

См .: http://forums.silverlight.net/forums/p/70925/170703.aspx#170703

Междоменная политика требуется (как показано в ответе Бена МакКормака выше).

Используя каналы Yahoo, настроенные для разрешения междоменного доступа к агрегированным каналам, вы можете использовать внешние службы данных ADO.NET (ранее Astoria, теперь OData) из приложения Silverlight.

Скорее всего, вы потеряете точность запроса набора данных, который вам дает Odata, но это можно воссоздать в каналах Yahoo.

Проблема заключалась не в службах данных ADO.NET (OData), а в Silverlight, поскольку он не разрешает междоменные вызовы.

person Community    schedule 30.06.2010