CrossDomainError в приложении IIS7 Silverlight 3 WCF - PullRequest
0 голосов
/ 25 августа 2009

* Читатели Остерегайтесь: массивный дамп кода, не для слабонервных ... *

Здравствуйте,

Я пытаюсь выяснить, как развернуть приложение Silverlight 3 на IIS7 с помощью службы WCF. Я думаю, что я понял большую часть этого, однако я все еще получаю междоменную ошибку по некоторым причинам. Я склоняюсь к мысли, что сервис не находит политику доступа клиента, но я не уверен, как это подтвердить. Я получаю очень бесполезное исключение (просто говорит CrossDomainError). Внутреннее исключение не существует. Вот шаги, которые я предпринял для развертывания приложения. Если кто-нибудь видит что-то, что не складывается, он может посоветовать? Я не могу думать ни о чем другом, чтобы тыкать прямо сейчас ...

  • В диспетчере IIS я создал новый сайт. Я назвал его Silverlight, принял пул с тем же именем и принял все остальные значения по умолчанию. Я отключил сайт по умолчанию. Я установил для веб-корня значение C: \ WebApps
  • Я поместил все файлы из сборки выпуска моего клиентского проекта Visual Studio Silverlight в корневой веб-каталог.
  • Я помещаю следующие файлы конфигурации из клиентского проекта Silverlight в корневой веб-каталог: ServiceReferences.ClientConfig, Silverlight.js.
  • Я поместил каталог / bin из сборки выпуска проекта Silverlight.Web в корневой веб-каталог
  • Я помещаю следующие файлы из сборки выпуска Silverlight.Web в корневой каталог: crossdomain.xml, clientaccesspolicy.xml, Service1.svc, Service1.svc.cs, Web.config.
  • Я переименовал файл TestPage.html в index.html.

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

Вот код для моих различных конфигурационных файлов:

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>

crossdomain.xml:

<!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>

конфигурация system.serviceModel, взята из Web.config:

<system.serviceModel>
        <behaviors>
            <serviceBehaviors>
                <behavior name="SilverlightApplication2.Web.Service1Behavior">
                    <serviceMetadata httpGetEnabled="true"/>
                    <serviceDebug includeExceptionDetailInFaults="false"/>
                </behavior>
            </serviceBehaviors>
        </behaviors>
        <bindings>
            <customBinding>
                <binding name="customBinding0">
                    <binaryMessageEncoding/>
                    <httpTransport/>
                </binding>
            </customBinding>
        </bindings>
        <serviceHostingEnvironment aspNetCompatibilityEnabled="true"/>
        <services>
            <service behaviorConfiguration="SilverlightApplication2.Web.Service1Behavior" name="SilverlightApplication2.Web.Service1">
                <endpoint address="http://win-xqawq222tag:2721/Service1.svc" binding="customBinding" bindingConfiguration="customBinding0" contract="SilverlightApplication2.Web.Service1"/>
                <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
            </service>
        </services>
    </system.serviceModel>

ServiceReferences.ClientConfig:

<configuration>
    <system.serviceModel>
        <bindings>
            <customBinding>
                <binding name="CustomBinding_Service1">
                    <binaryMessageEncoding />
                    <httpTransport maxReceivedMessageSize="2147483647" maxBufferSize="2147483647" />
                </binding>
            </customBinding>
        </bindings>
        <client>
            <endpoint address="http://win-xqawq222tag:2721/Service1.svc" binding="customBinding"
                bindingConfiguration="CustomBinding_Service1" contract="ServiceReference1.Service1"
                name="CustomBinding_Service1" />
        </client>
    </system.serviceModel>
</configuration>

Service1.svc:

<%@ ServiceHost Language="C#" Debug="true" Service="SilverlightApplication2.Web.Service1" CodeBehind="Service1.svc.cs" %>

Теперь за реализацией следует код клиента:

Service1.svc.cs:

using System;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.ServiceModel.Activation;
using System.Collections.Generic;
using System.Text;

namespace SilverlightApplication2.Web
{
    [ServiceContract(Namespace = "")]
    [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
    public class Service1
    {
        [OperationContract]
        public DoWorkResult DoWork()
        {
            // Add your operation implementation here
            int i = new Random().Next();
            string s = "test string";
            DoWorkResult r = new DoWorkResult() { String = s, Integer = i };
            return r;
        }

        // Add more operations here and mark them with [OperationContract]
    }

    [DataContract]
    public class DoWorkResult
    {
        [DataMember]
        public string String { get; set; }

        [DataMember]
        public int Integer { get; set; }
    }
}

MainPage.xaml.cs:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;

namespace SilverlightApplication2
{
    public partial class MainPage : UserControl
    {
        public MainPage()
        {
            InitializeComponent();

            ServiceReference1.Service1Client proxy = new SilverlightApplication2.ServiceReference1.Service1Client();
            proxy.DoWorkCompleted += new EventHandler<SilverlightApplication2.ServiceReference1.DoWorkCompletedEventArgs>(proxy_DoWorkCompleted);
            proxy.OpenAsync();
            proxy.DoWorkAsync();
            proxy.CloseAsync();
        }

        void proxy_DoWorkCompleted(object sender, SilverlightApplication2.ServiceReference1.DoWorkCompletedEventArgs e)
        {
            if (e.Error == null)
            {
                String.Text = "Test String is: " + e.Result.String;
                Integer.Text = "Random Int is: " + e.Result.Integer;
            }
            else
            {
                String.Text = e.Error.Message + e.Error.InnerException.Message + e.Error.StackTrace;
                Integer.Text = e.Error.Message + e.Error.InnerException.Message + e.Error.StackTrace;
            }
        }
    }
}

Все это прекрасно работает в VS 2008 на XP Pro. На IIS7 на Server2008 я могу перейти на страницу по умолчанию index.html по http://localhost или по http://[myComputerName].

Я также могу подключиться к службе по http://localhost/Service1.svc. Я не могу подключиться к службе по http://[compNameHere]/Service1.svc. Он жалуется на эту ошибку:

Нет привязки протокола совпадает с заданным адрес 'http://win -xqawq222tag: 2721 / Service1.svc '. Привязки протокола настраиваются в Уровень сайта в IIS или WAS конфигурации. Описание: Ан необработанное исключение произошло во время выполнение текущей сети запрос. Пожалуйста, просмотрите трассировку стека для получения дополнительной информации об ошибке и откуда он возник в коде.

Сведения об исключении: System.InvalidOperationException: нет привязка протокола соответствует заданному адрес 'http://win -xqawq222tag: 2721 / Service1.svc '. Привязки протокола настраиваются в Уровень сайта в IIS или WAS конфигурации.

Ошибка источника:

Создано необработанное исключение во время исполнения текущего веб-запрос. Информация относительно Происхождение и место исключения можно определить с помощью исключения трассировка стека ниже.

Трассировка стека:

[InvalidOperationException: Нет привязка протокола соответствует заданному адрес 'http://win -xqawq222tag: 2721 / Service1.svc '. Привязки протокола настраиваются в Уровень сайта в IIS или WAS конфигурации.]
System.ServiceModel.Channels.TransportChannelListener.OnOpening () +11513378 System.ServiceModel.Channels.CommunicationObject.Open (TimeSpan тайм-аут) + 229
System.ServiceModel.Dispatcher.ChannelDispatcher.OnOpen (TimeSpan тайм-аут) + 72

[InvalidOperationException: The ChannelDispatcher на 'http://win -xqawq222tag: 2721 / Service1.svc с контрактом (ами) не могу открыть свой IChannelListener.] System.ServiceModel.Dispatcher.ChannelDispatcher.OnOpen (TimeSpan тайм-аут) + 118
System.ServiceModel.Channels.CommunicationObject.Open (TimeSpan тайм-аут) + 261
System.ServiceModel.ServiceHostBase.OnOpen (TimeSpan тайм-аут) + 107
System.ServiceModel.Channels.CommunicationObject.Open (TimeSpan тайм-аут) + 261
System.ServiceModel.HostingManager.ActivateService (String normalizedVirtualPath) + 121
System.ServiceModel.HostingManager.EnsureServiceAvailable (String normalizedVirtualPath) + 479

[ServiceActivationException: The служба '/Service1.svc' не может быть активирован из-за исключения во время сборник. Сообщение об исключении является: ChannelDispatcher на 'http://win -xqawq222tag: 2721 / Service1.svc с контрактом (ами) не могу открыть свой IChannelListener ..] System.ServiceModel.AsyncResult.End (IAsyncResult результат) + 11531006
System.ServiceModel.Activation.HostedHttpRequestAsyncResult.End (IAsyncResult результат) + 194
System.ServiceModel.Activation.HostedHttpRequestAsyncResult.ExecuteSynchronous (HttpApplication context, Boolean flowContext) + 176
System.ServiceModel.Activation.HttpHandler.ProcessRequest (HttpContext контекст) + 23
System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute () +181 System.Web.HttpApplication.ExecuteStep (IExecutionStep шаг, логическое и завершено синхронно) + 75

Нет привязки протокола совпадает с заданным адрес 'http://win -xqawq222tag: 2721 / Service1.svc '. Привязки протокола настраиваются в Уровень сайта в IIS или WAS конфигурации.

Кроме того, я могу нажать на файл политики в http://localhost/clientaccesspolicy.xml и http://[computerNameHere]/clientaccesspolicy.xml.

Есть ли что-то еще, на что мне нужно взглянуть?

Ответы [ 2 ]

1 голос
/ 28 августа 2009

Я свободно признаю, что не пытался точно воспроизвести вашу конкретную ошибку, но я заметил кое-что, что слишком застрял.

Колин Коул опубликовал в блоге заметное изменение формата cap.xml в отношении использования SSL. Я не использовал SSL, но только когда я изменил

<allow-from http-request-headers="*">
    <domain uri="*"/>
</allow-from>

до

<allow-from http-request-headers="*">
    <domain uri="http://*" />
    <domain uri="https://*" /> <!-- if needed -->
</allow-from>

доступ к сервису сработал.

0 голосов
/ 31 августа 2009

Мне пришлось внести следующие изменения в файл ServiceReferences.ClientConfig, а затем снова опубликовать:

<configuration>
    <system.serviceModel>
        <bindings>
            <customBinding>
                <binding name="CustomBinding_Service1">
                    <binaryMessageEncoding />
                    <httpTransport maxReceivedMessageSize="2147483647" maxBufferSize="2147483647" />
                </binding>
            </customBinding>
        </bindings>
        <client>
            <endpoint address="http://localhost/Service1.svc" binding="customBinding"
                bindingConfiguration="CustomBinding_Service1" contract="ServiceReference1.Service1"
                name="CustomBinding_Service1" />
          <!--<endpoint address="http://localhost:2721/Service1.svc" binding="customBinding"
                bindingConfiguration="CustomBinding_Service1" contract="ServiceReference1.Service1"
                name="CustomBinding_Service1" />-->
        </client>
    </system.serviceModel>
</configuration>
...