Я видел много ссылок на 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();
}
- Запустите приложение Silverlight. В моем случае я собираюсь на свою страницу тестирования Silverlight по адресу: http://localhost:15558/SilverlightApplication1TestPage.aspx
Запуск и, конечно же, взорван из-за проблем с 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, но он дает аналогичный результат.