Bezdepbonusu7Программирование: статьи и ответы

Вопрос

WCF / Чсла Ад

Автор вопроса: SteveОтветов: 1

Я пытаюсь создать пробное приложение Csla 3.7/Silverlight 3 и работаю над Учебники Рокки. Это действительно простое приложение для редактирования данных одной формы/одного бизнес-объекта, и все просто замечательно вплоть до того момента, когда я пытаюсь настроить Wcf, чтобы приложение Silverlight могло взаимодействовать с порталом данных.

Ошибка, которую я получаю:

CommunicationException was unhandled by user code

An error occurred while trying to make a request to URI 'http://localhost:1406/WcfPortal.svc'.
This could be due to attempting to access a service in a cross-domain way without a proper cross-domain policy in place, or a policy that is unsuitable for SOAP services.
You may need to contact the owner of the service to publish a cross-domain policy file and to ensure it allows SOAP-related HTTP headers to be sent.
This error may also be caused by using internal types in the web service proxy without using the InternalsVisibleToAttribute attribute.
Please see the inner exception for more details.

Я совершенно озадачен этим, так как я немного новичок в Silverlight и WCF. Моя установка довольно проста для приложения Csla Silverlight. У меня есть 4 проекта:

  • CslaSilverlight: Проект Silverlight
  • CslaSilverlight.Client: библиотека классов Silverlight
  • CslaSilverlight.Server: библиотека классов .NET
  • CslaSilverlight.Web: проект ASPNET для размещения приложения SL.

Все работает локально на моем ноутбуке под Cassini. Я хочу, чтобы DataPortal работал вне Silverlight, чтобы я мог получить доступ к SQL Server. Я думаю, что проблема может быть связана с моей конфигурацией Wcf в приложении Silverlight, которая указана в файле ServiceReferences.ClientConfig:

<configuration>
    <system.serviceModel>
        <bindings>
            <basicHttpBinding>
                <binding name="BasicHttpBinding_IWcfPortal" maxBufferSize="65536"
                    maxReceivedMessageSize="65536" receiveTimeout="10" sendTimeout="10">
                </binding>
            </basicHttpBinding>
        </bindings>
        <client>
            <endpoint address="http://localhost:1406/WcfPortal.svc"
                binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_IWcfPortal"
                contract="Csla.WcfPortal.IWcfPortal" name="BasicHttpBinding_IWcfPortal" />
        </client>
    </system.serviceModel>
</configuration>

Мне интересно, важен ли номер порта, когда я меняю его, я получаю другую ошибку. Мне также интересно, правильный ли формат адреса конечной точки.

Не уверен, что это важно, но мои настройки serviceModel из ASPNet web.config:

  <system.serviceModel>
    <behaviors>
      <serviceBehaviors>
        <behavior name="WcfPortalBehavior">
          <serviceMetadata httpGetEnabled="true"/>
          <serviceDebug includeExceptionDetailInFaults="true"/>
        </behavior>
      </serviceBehaviors>
    </behaviors>
    <services>
      <service behaviorConfiguration="WcfPortalBehavior" name="Csla.Server.Hosts.Silverlight.WcfPortal">
        <endpoint address="" binding="basicHttpBinding" contract="Csla.Server.Hosts.Silverlight.IWcfPortal">
          <identity>
            <dns value="localhost"/>
          </identity>
        </endpoint>
        <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
      </service>
    </services>
  </system.serviceModel>

wcfsilverlightcsla

Ответы

Ответ 1 · рейтинг 3 · Andrew

Если я правильно думаю, то ошибка может сообщать вам совершенно правильную вещь: вам не хватает междоменной политики. Приложение Silverlight получает доступ к службе WCF из удаленного расположения и требует авторизации для принятия запроса.

Это произошло со мной в разработке, когда проект состоял из трех частей: приложения SL, веб-службы WCF и веб-сайта. Веб-сайт и служба WCF работают независимо, хотя и являются частью одного и того же решения. Таким образом, Cassini запускается дважды, и вы пересекаете границу.

У меня есть файл 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>

Файл разрешающий всем и вся, вы бы его доработали для продакшена, но в dev это был самый простой способ. Политика доступа клиента Google wcf / междоменная политика wcf - это распространенная проблема.

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы