Подтвердить что ты не робот

Silverlight Crossdomain

Я видел много ссылок на 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();
    }

Запуск и, конечно же, взорван из-за проблем с crossdomain. Итак, добавьте следующий файл 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-сервисов. Вам может потребоваться связаться с владельцем службы, чтобы опубликовать файл политики междоменного доступа и обеспечить его отправку HTTP-заголовков, связанных с SOAP.

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

4b9b3361

Ответ 1

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

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

Ответ 2

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

Ответ 3

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

C:\Inetpub\Wwwroot\clientaccesspolicy.xml

Это позволит убедиться, что он доступен непосредственно по адресу http:///clientaccesspolicy.xml

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

Ответ 4

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

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

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

Локальный запуск Silverlight

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

Ответ 5

Что-то, что сработало для меня, начиналось с того, что я нашел на форумах silverlight здесь. По сути, он спросил, могу ли я даже получить для моего clientaccesspolicy.xml или crossdomain.xml из localhost (http://localhost/clientaccesspolicy.xml). Когда я пытался туда перемещаться, я не мог так просто найти код для обоих из них (также в вышеупомянутом потоке) и скопировать в код внутри файлов, существующих в моем каталоге inetpub\wwwroot\(I открыли их с помощью 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

Ответ 6

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

Ответ 7

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

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

Бест, Jeppen

Ответ 8

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

    **

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

**

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

Ответ 9

Я столкнулся с чем-то подобным, и добавив ServiceHostFactory, исправил мою проблему. Один файл политики междоменной политики не исправил его.

class MyHostFactory : ServiceHostFactory
{
    protected override ServiceHost CreateServiceHost(Type serviceType, Uri[] baseAddresses)
    {
        MyHost customServiceHost =
          new MyHost(serviceType, new Uri("[Your URL goes here]",UriKind.Absolute));

        return customServiceHost;
    }
}

class MyHost : ServiceHost
{
    public MyHost(Type serviceType, params Uri[] baseAddresses)   base(serviceType, baseAddresses)
    { }

    protected override void ApplyConfiguration()
    {
        base.ApplyConfiguration();
    }
}

Вам также нужно добавить Factory= "MyHostFactory" в тег, который определяет вашу службу

Ответ 10

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

[ServiceContract]
    public interface ICrossDomainService
    {
        [OperationContract]
        [WebGet(UriTemplate = "ClientAccessPolicy.xml")]
        Message ProvidePolicyFile();
    }

а затем ProvidePolicyFile() может быть

public System.ServiceModel.Channels.Message ProvidePolicyFile()
        {
            FileStream filestream = File.Open(@"ClientAcessPolicy.xml", FileMode.Open);
            // Either specify ClientAcessPolicy.xml file path properly
            // or put that in \Bin folder of the console application
            XmlReader reader = XmlReader.Create(filestream);
            System.ServiceModel.Channels.Message result = Message.CreateMessage(MessageVersion.None, "", reader);
            return result;
        }

Ответ 11

Он успешно работал в моем компьютере, вы можете разместить свой

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>

и ваш каталог проекта, и ваш веб-сервер root.

Ответ 12

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

Ответ 13

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