Silverlight Crossdomain - PullRequest
       16

Silverlight Crossdomain

25 голосов
/ 16 января 2009

Я видел много ссылок на MSDN и "работает на моей машине!" ответы, поэтому я хотел бы задать свой вопрос с точными шагами, чтобы дублировать то, что я делаю. Поскольку мы используем уже существующий веб-сервис, я спрашиваю в контексте размещения веб-сервиса за пределами моего проекта, в отличие от многих учебных пособий и видео в Интернете. Итак, вот так:

*** Создайте новый проект веб-сервиса ASP.NET.

Он будет поставляться с существующим файлом Service.asmx, предоставляющим веб-метод HelloWorld.

Просмотр в браузере, нажмите кнопку «Вызвать». Должно работать, возвращая строку «Hello World».

На моей машине URL-адрес: "http://localhost:15511/WebSite5/Service.asmx"

*** Запустите новый экземпляр Visual Studio, создайте проект веб-приложения Silverlight.

*** Нажмите одну кнопку там с обработчиком событий для вызова веб-службы. Я лично взломал Grid и использую простую StackPanel. например.

<UserControl x:Class="SilverlightApplication1.Page"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Width="400" Height="300">
    <StackPanel>
        <Button Click="Button_Click">
            <Button.Content>
                <TextBlock Text="Test"/>
            </Button.Content>
        </Button>
    </StackPanel>
</UserControl>

Добавить веб-ссылку, используя оператор и обработчик события для Button_Click:

    private void Button_Click(object sender, RoutedEventArgs e)
    {
        ServiceSoapClient client = new ServiceSoapClient();
        client.HelloWorldCompleted += (object s, HelloWorldCompletedEventArgs ea) => { 
            MessageBox.Show(ea.Result); 
        };
        client.HelloWorldAsync();
    }

Запустите и, конечно, он взорвется из-за проблем с доменами. Затем добавьте файл 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>

Это должно открыть вещи, так как у него есть подстановочный знак для заголовков, юрисдикций и ресурсов, верно?

  • Запустите снова, и вы получите ошибку:

Произошла ошибка при попытке сделать запрос к URI 'http://localhost:15511/WebSite5/Service.asmx'. Это может быть связано с попыткой доступа к услуге междоменным способом без соответствующей междоменной политики или политики это не подходит для сервисов SOAP. Вам может потребоваться связаться с владельцем службы, чтобы опубликовать файл междоменной политики и убедиться, что он позволяет отправлять связанные с SOAP заголовки HTTP.

Итак, вопрос: есть ли секрет в файле clientaccesspolicy? Можно поочередно попробовать использовать файл crossdomain.xml, но он даст аналогичный результат.

Ответы [ 13 ]

8 голосов
/ 20 сентября 2013

Я столкнулся с этой проблемой (SL v5.0 и Visual Studio 2010), что исправило для меня то, что я зашел в свойства проекта Silverlight >> вкладку Silverlight и выбрал «Требовать повышенное доверие при работе в браузере»

5 голосов
/ 17 февраля 2009

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

Мой пост на тему: http://www.donnfelker.com/silverlight-cross-domain-issue/

4 голосов
/ 03 августа 2011

Убедитесь, что вы поместили файл clientaccesspolicy.xml в корень веб-каталога IIS, например,

C: \ Inetpub \ Wwwroot \ clientaccesspolicy.xml

Это обеспечит доступ к нему по адресу http: ///clientaccesspolicy.xml

.

Я получил ту же ошибку и решил ее, выполнив вышеуказанные шаги.

2 голосов
/ 27 апреля 2012

Что-то, что сработало для меня, началось с того, что я нашел на форумах silverlight здесь . По сути, он спросил, могу ли я даже получить на свой clientaccesspolicy.xml или crossdomain.xml от localhost (http://localhost/clientaccesspolicy.xml). Когда я попытался перейти туда, я не смог, поэтому я просто нашел код для них обоих (также в вышеупомянутом потоке), и скопировать его в код из тех файлов, которые есть в моем каталоге inetpub \ wwwroot \ (я открыл их с помощью Notepad ++). Странная часть была , код не изменился в все , и все же, это работает! Надеюсь, это кому-нибудь поможет! Это было очень странно.

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 path="/" include-subpaths="true"/>
      </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>

Будь благословен!

-sf

2 голосов
/ 16 января 2009

Конфигурация клиента

Может быть, ваш ServiceReferences.ClientConfig для вашего клиента Silverlight указывает на неправильный URL?

Кроме того, проверьте расположение файла междоменной политики. Эта статья MSDN содержит больше информации.

локально работающий Silverlight

Дополнительные примечания для локального запуска Silverlight (например, боковой панели Vista). Как сообщается в этой записи блога , «Silverlight не может использовать какого-либо сетевого провайдера при локальной работе.» Обходной путь должен использовать javascript для взаимодействия с веб-службой в этой ситуации.

1 голос
/ 21 января 2012

Вы должны знать о ситуации, когда при ссылке на ваш сервис внутри вашего проекта будет создан файл "Reference.ClienConfig", и там будет:

    **

<endpoint address="http://localhost:57675/Servis.asmx" binding="basicHttpBinding"
            bindingConfiguration="ServisSoap" contract="ServiceReference1.ServisSoap"
            name="ServisSoap" />

**

Убедитесь, что ваша страница все еще использует тот же порт (например, здесь 57675). По умолчанию ваш localhost получит случайный порт, поэтому вы должны изменить его на статический номер, а не на динамический. (Щелкните правой кнопкой мыши на проекте asp.net / Tab Web / Конкретный порт / номер типа Надеюсь, это поможет

1 голос
/ 12 августа 2011

Я изменил настройки своего Internet Explorer. Сайт работает на внутреннем веб-сервере, поэтому я добавил его в список доверенных сайтов Iexplorer. (Сервис-> Свойства обозревателя-> Безопасность-> Сайты).

Затем я изменил уровень безопасности и включил кросс-домены. Готово, работает, но мне потребовалось время, чтобы найти решение.

Лучший, Jeppen

1 голос
/ 12 февраля 2009

Вы пробовали fiddler при использовании этого через IE, вы могли бы видеть, что вызывает серебряный свет трафика, например, какие файлы кросс-политики он ищет?

0 голосов
/ 23 ноября 2015

Я столкнулся с той же проблемой, и мне потребовалось более 3 дней, чтобы разобраться в этой проблеме. Я также замечаю, что когда я звонил в Интернет Cloud Service WCF из приложения Silverlight, размещенного на другом веб-сервере, оно просто отображало междоменные ошибки. Изучив некоторые сообщения, я не решил проблему, даже поместив файлы cross-domain.xml и clientaccesspolice.xml в корневой каталог службы. Поэтому я просто пытаюсь вместо http://example.com просто изменить его на безопасный https://example.com, и он просто работает нормально. Междоменные ошибки исчезают. Сервис был вызван без проблем.

0 голосов
/ 19 апреля 2013

Проверьте, какой проект установлен по умолчанию. Это должен быть веб-проект, который должен быть установлен по умолчанию, а не проект silverlight.

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