Я видел много ссылок на 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, но он даст аналогичный результат.