Я создал веб-приложение со встроенным в него проектом Silverlight, используя VS 2008 SP 1 и инструменты Silverlight 3 для Vista и Windows 7.
Код дуплексной службы:
[ServiceContract(Namespace = "cotoco", CallbackContract = typeof(IDuplexClient))]
[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)]
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
public class DuplexServer
{
private IDuplexClient _client;
private string _message;
private int _messageCounter;
private Timer _timer;
public DuplexServer()
{
}
#region IDuplexServer Members
[OperationContract(IsOneWay = true)]
public void SendEcho(string message)
{
_client = OperationContext.Current.GetCallbackChannel<IDuplexClient>();
_message = message;
_timer = new Timer();
_timer.Interval = 2000;
_timer.Enabled = true;
_timer.Elapsed += new ElapsedEventHandler(_timer_Elapsed);
_timer.Start();
}
void _timer_Elapsed(object sender, ElapsedEventArgs e)
{
_client.ReturnEcho(string.Format("Duplex Echo {0}: {1}", _messageCounter, _message));
_messageCounter++;
if (_messageCounter > 5)
_timer.Dispose();
}
#endregion
}
[ServiceContract]
public interface IDuplexClient
{
[OperationContract(IsOneWay = true)]
void ReturnEcho(string message);
}
Раздел конфигурации дуплекса:
<поведение name = "DuplexServerBehavior">
<конечная точка address = "" binding = "wsDualHttpBinding" contract = "DuplexServer" />
<конечная точка address = "mex" binding = "mexHttpBinding" contract = "IMetadataExchange" />
Я настроил дуплексную службу в клиентском приложении следующим образом:
Binding svcBinding;
EndpointAddress svcAddress;
svcBinding = new PollingDuplexHttpBinding() { UseTextEncoding = true };
svcAddress = new EndpointAddress("http://localhost/CTC.Test.WCF.Server/DuplexServer.svc");
_duplex = new DuplexServerClient(svcBinding, svcAddress);
Я использовал службу Simplex в тандеме с этим, и вызовы службы Simplex попали в настройку точек останова на сервере, и я могу перейти.
Вызовы в службу Duplex не достигают точек останова, хотя на клиенте не возникает никаких ошибок. Если я проверяю трафик HTTP с помощью Fiddler, я вижу сотни 202 запросов, запускаемых после первоначального запроса - я предполагаю, что это запросы на опрос.
Первоначальный дуплексный запрос:
POST http://localhost/CTC.Test.WCF.Server/DuplexServer.svc HTTP / 1.1
Принимаем: /
Длина содержимого: 665
Тип контента: приложение / мыло + xml; кодировка = UTF-8
UA-CPU: x86
Accept-Encoding: gzip, выкачать
Пользовательский агент: Mozilla / 4.0 (совместимый; MSIE 7.0; Windows NT 6.0; (R1 1.6); SLCC1; .NET CLR 2.0.50727; InfoPath.2; .NET CLR 3.5.21022; .NET CLR 3.5.3072929;. NET CLR 3.0.30618)
Ведущий: cotocovista4.cotoco.local
Подключение: Keep-Alive
Прагма: без кеша
urn: IDuplexServer / SendEcho </ a: Action> 43f9e320-cde3 -4e21-a748-e5b29c10ee25 </ netdx: SessionId> </ netdx: дуплекс> http://docs.oasis -open.org / ws-rx / wsmc / 200702 / anonymous? Id = ae3e3139-0df8-41eb-97db-69c2c48782b7 </ netdx: адрес> 43f9e320-cde3-4e21-a748-e5b29c10ee25 </ netdx: SessionId> </ netdx: дуплекс> Message!http://cotocovista4.cotoco.local/CTC.Test.WCF.Server/DuplexServer.svcMessage!;
Последующие дуплексные запросы:
POST http://localhost/CTC.Test.WCF.Server/DuplexServer.svc HTTP / 1.1
Принимаем: /
Контент-длина: 588
Тип контента: приложение / мыло + xml; кодировка = UTF-8
UA-CPU: x86
Accept-Encoding: gzip, выкачать
Пользовательский агент: Mozilla / 4.0 (совместимый; MSIE 7.0; Windows NT 6.0; (R1 1.6); SLCC1; .NET CLR 2.0.50727; InfoPath.2; .NET CLR 3.5.21022; .NET CLR 3.5.3072929;. NET CLR 3.0.30618)
Ведущий: cotocovista4.cotoco.local
Подключение: Keep-Alive
Прагма: без кеша
http://docs.oasis -open.org / ws-rx / wsmc / 200702 / MakeConnection </ a: Action> s: mustUnderstand = "1"> http://cotocovista4.cotoco.local/CTC.Test.WCF.Server/DuplexServer.svc xmlns: wsmc = "http://docs.oasis -open.org / ws-rx / wsmc / 200702"> http://docs.oasis -open.org / WS-гх / WSMC / 200702 / анонимный идентификатор = ae3e3139-0df8-41eb-97dB-69c2c48782b7 </ WSMC: Адрес> </ WSMC: MakeConnection> < / с: Body> </ с: Конверт & GT </a>; * 1 061 *
Кто-нибудь знает, почему это произошло, я подумал, что наконец-то заподозрил последнюю проблему, когда она перестала выдавать исключения подключения ...
Привет
Трис
Обновление: я пытался воссоздать это в следующих типах проектов: Приложение WCF, Веб-приложение, Веб-проект. Мне удалось без труда реализовать пример MS, который использует сообщения WCF для параметров дуплекса, но я искал быстрый способ сборки дуплексных веб-служб с использованием WSDL.