Вопрос

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

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

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

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

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

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

*** Вставьте туда одну кнопку с обработчиком событий, чтобы вызвать веб-службу.Я лично запускаю nuke the 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 и ресурсов, верно?

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

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

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

Это было полезно?

Решение

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

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

Другие советы

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

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

C:\Inetpub\wwwroot\clientaccesspolicy.xml

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

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

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

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

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

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

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

Кое-что, что сработало у меня, началось с того, что я нашел на форумах silverlight здесь.По сути, это спрашивало, могу ли я даже получить на мой clientaccesspolicy.xml или crossdomain.xml с локального хостинга (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>

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

-сф

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

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

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

Лучший, Джеппен

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

    **

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

**

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

Я столкнулся с чем-то подобным, и добавление 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" в тег, который определяет ваш сервис

Проблема может заключаться в том, что ваш сервер разработки не может обслуживать 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;
        }

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

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>

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top