* Читатели Остерегайтесь: массивный дамп кода, не для слабонервных ... *
Здравствуйте,
Я пытаюсь выяснить, как развернуть приложение 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.
Есть ли что-то еще, на что мне нужно взглянуть?