Silverlight при доступе к службе WCF выдает междоменную ошибку

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

Я получаю доступ к службе WCF из клиента Silverlight 4. У меня есть Clientacccesspolicy.xml и Crossdomain.xml в wwwroot.

Я могу получить доступ к своему файлу с помощью [http: //localhost/Remoteapp.html]. Но я получаю междоменную ошибку, несмотря на наличие файла Clientaccesspolicy.xml в корне, когда приложение пытается выполнить вызов веб-службы.

В webdevelopementhelper я вижу, что clientaccesspolicy запрашивается на порту wcfservice, который находится в [http // localhost: 600061 / clientaccesspolicy.xml], где находится моя служба, и я получаю ответ 502 [Connection failed].

Когда я набираю [http: //localhost/Clientaccesspolicy.xml] в браузере, я могу найти файл. Но silverlight запрашивает файл политики не в том месте.

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

Может ли кто-нибудь помочь мне решить эту проблему? Заранее спасибо всем.


person Sullivan    schedule 22.08.2013    source источник


Ответы (4)


Шаг 1. Убедитесь, что у вас есть файл clientaccesspolicy.xml или crossdomain.xml на узле службы WCF.

Следующий clientaccesspolicy.xml

<?xml version="1.0" encoding="utf-8"?>
<access-policy>
  <cross-domain-access>
    <policy>
      <allow-from http-request-headers="SOAPAction">
        <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>

если это не сработает, попробуйте эти шаги

  1. На сервере, где развернуто приложение silverlight, обычно в папке ClientBin приложения ASP.NET, переименуйте файл приложения silverlight * .xap в * .zip.

  2. Извлеките содержимое zip-файла

  3. Отредактируйте файл ServiceReferences.ClientConfig.

  4. Обновите адрес конечной точки с localhost до адреса сервера, на котором размещена служба WCF.

  5. Сохраните файл. Заархивируйте содержимое и переименуйте обратно в .xap

person Sajeetharan    schedule 23.08.2013
comment
Ответил выше, так как я не мог вставить поле для комментариев из-за его длины - person Sullivan; 24.08.2013

Шаг 1. Поместите crossdomain.xml со следующим кодом в папку хостинга веб-службы.

<?xml version="1.0" ?>
<cross-domain-policy>
    <site-control permitted-cross-domain-policies="master-only"/>
    <allow-access-from domain="*"/>
    <allow-http-request-headers-from domain="*" headers="*"/>
</cross-domain-policy>

Шаг 2: Поместите тот же файл в свой проект silverlight также, когда вы добавляете ссылку на вышеуказанный веб-сервис WCF.

Шаг 3. Обновите ссылку и опубликуйте проект Silverlight.

Попробуйте эти шаги. Это точно будет работать.

person Sunil Khalas    schedule 31.08.2013

Я также столкнулся с той же проблемой, и после недели моих трейлов я узнал, что наличие ClientAcessPolicy.xml и CrossDomainPolicy.xml в корневом каталоге не будет обслуживать запрос ur, ClientAcessPolicy.xml и CrossDomianPolicy.xml должны быть отправлены через службу Только.

Выполните следующие шаги, чтобы решить эту проблему.

  1. Добавьте новое пространство имен в Iservice1.cs, как показано ниже.

    [ServiceContract(Namespace = "http://ServiceWCF")]
    
    public interface IPolicyRetriever
     {
       [OperationContract, WebGet(UriTemplate = "/clientaccesspolicy.xml")]
    
       Stream GetSilverlightPolicy();
    
       [OperationContract, WebGet(UriTemplate = "/crossdomain.xml")]
    
       Stream GetFlashPolicy();
     };
    
  2. Теперь отредактируйте файл Service1.svc с правками,

    public class PolicyClass : IPolicyRetriever
    {
        Stream StringToStream(string result)
        {
            WebOperationContext.Current.OutgoingResponse.ContentType = "application/xml";
            return new MemoryStream(Encoding.UTF8.GetBytes(result));
        }
        public Stream GetSilverlightPolicy()
        {
            string result = @"<?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>";
            return StringToStream(result);
        }
        public Stream GetFlashPolicy()
        {
            string result = @"<?xml version=""1.0""?>
                            <!DOCTYPE cross-domain-policySYSTEM""http://www.macromedia.com/xml/dtds/cross-domain-policy.dtd"">
                            <cross-domain-policy>
                                <allow-access-from domain=""*"" />
                            </cross-domain-policy>";
            return StringToStream(result);
        }
    }
    
  3. Теперь добавьте оба файла в расположение проекта.

  4. Лучше, чтобы избежать некоторых проблем, мы можем добавить как файл в корневую папку, так и
person KHV    schedule 25.10.2016

Это некоторые из изменений, которые необходимо внести и в Internet Explorer, после того как служба будет запущена. Теперь проверьте в браузере, доступны ли ClientAccesspolicy.xml и Crossdoaminpolicy.xml из Internet Explorer. После того, как все это будет сделано, ссылка на виртуальную машину Microsoft Azure должна быть добавлена ​​в браузере как надежный сайт или домен.

  1. Сначала перейдите в Internet Explorer-> Свойства обозревателя -> Безопасность -> Локальная интрасеть-> Сайты.

Теперь установите флажок «Автоматически определять сеть интрасети», нажмите «Дополнительно» и добавьте соответствующий URL-адрес сайта виртуальной машины.

  1. Internet Explorer-> Свойства обозревателя -> Безопасность -> Надежный сайт, добавьте URL-адрес SP2013, который в качестве добавленного URL-адреса

Теперь в том же окне нажмите Custom Level Enable all .Net Framework, Active X Controls, Enable .Net Framework Setup.

  1. Теперь перейдите на вкладку «Дополнительно» и снимите флажок «Отключить отладку сценария» (Internet Explorer), «Отключить отладку сценария» (другие).

На той же вкладке нам также нужно включить некоторые параметры, а именно: «Разрешить запуск активного содержимого с компакт-дисков на моем компьютере», «Разрешить запуск активных элементов управления в файлах на моем компьютере», «Включить поддержку встроенного XMLHTTP».

После того, как все это будет сделано, проверьте погоду, приложение Sliverlight работает правильно. Конечно, если эти шаги выполнены правильно, приложение будет работать безупречно.

person KHV    schedule 28.10.2016