Ответ 1
У меня была такая же проблема несколько раз. Раньше я решил это, используя веб-приложение в качестве запуска, но похоже, что вы уже это сделали.
Мой пост по теме: http://www.donnfelker.com/silverlight-cross-domain-issue/
Я видел много ссылок на 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, но он дает аналогичный результат.
У меня была такая же проблема несколько раз. Раньше я решил это, используя веб-приложение в качестве запуска, но похоже, что вы уже это сделали.
Мой пост по теме: http://www.donnfelker.com/silverlight-cross-domain-issue/
Я столкнулся с этой проблемой (SL v5.0 и Visual Studio 2010), что исправлено для меня, так это то, что я вошел в свойства проекта Silverlight → Вкладка Silverlight и выбрала "Требовать повышенное доверие при работе в браузере"
Убедитесь, что вы поместили файл clientaccesspolicy.xml в корень веб-каталога IIS, например.
C:\Inetpub\Wwwroot\clientaccesspolicy.xml
Это позволит убедиться, что он доступен непосредственно по адресу http:///clientaccesspolicy.xml
Я получал ту же ошибку, и я решил, что делаю вышеуказанные шаги.
Возможно, ваш ServiceReferences.ClientConfig
для вашего клиента Silverlight указывает на неправильный URL-адрес?
Кроме того, проверьте расположение файла политики междоменной политики. Эта статья MSDN содержит дополнительную информацию.
Дополнительное примечание для запуска Silverlight локально (например, боковая панель Vista). Как сообщается в этой записи в блоге, "Silverlight не может использовать ни одного сетевого провайдера при запуске локально". Обходной путь заключается в использовании javascript для взаимодействия с веб-службой в этой ситуации.
Что-то, что сработало для меня, начиналось с того, что я нашел на форумах 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
Вы пробовали fiddler при использовании этого через IE, вы могли бы увидеть, что вызывает появление сигнала silverlight, например файлы перекрестных политик, которые он ищет?
Я изменил настройки моего Internet Explorer. Веб-сайт работает на веб-сервере-стажера, поэтому я добавил его в список надежных сайтов Iexplorer. (Инструменты- > Свойства обозревателя- > Безопасность- > Сайты).
Затем я изменил уровень безопасности и включил перекрестные домены. Done, Works, но взял меня, чтобы найти решение.
Бест, Jeppen
Вы должны знать, что при обращении к вашей службе внутри вашего проекта будет создан файл "Reference.ClienConfig" и есть:
**
<endpoint address="http://localhost:57675/Servis.asmx" binding="basicHttpBinding"
bindingConfiguration="ServisSoap" contract="ServiceReference1.ServisSoap"
name="ServisSoap" />
**
Убедитесь, что ваша страница все еще использует один и тот же порт (например, здесь 57675). По умолчанию ваш localhost получит случайный порт, поэтому вам нужно изменить его как статичное, а не динамическое. (Щелкните правой кнопкой мыши по проекту asp.net/Tab Web/Конкретный номер порта/типа Надеюсь, что это поможет.
Я столкнулся с чем-то подобным, и добавив 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>
и ваш каталог проекта, и ваш веб-сервер root.
Я столкнулся с той же проблемой и уделил больше 3 дней, чтобы выяснить проблему. Я также замечаю, что когда я звонил в интернет-службу Cloud Service WCF из приложения Silverlight, размещенного на другом веб-сервере, он просто обнаружил ошибки междоменных. Изучив некоторые сообщения, я не решил проблему, даже поставив файлы cross-domain.xml и clientaccesspolice.xml в корневой каталог службы. Поэтому я просто пытаюсь вместо http://example.com Я просто меняю его на https://example.com, и он просто отлично работал. Ошибки кросс-домена исчезают. служба была вызвана без проблем.
Проверьте, какой проект установлен по умолчанию. Это должен быть веб-проект, который должен быть установлен по умолчанию, а не проект silverlight.