Я создал веб-приложение со встроенным в него проектом 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);
}
Раздел дуплексной конфигурации:
‹System.serviceModel› ‹behaviors› ‹serviceBehaviors› ‹поведение name =" DuplexServerBehavior "› ‹serviceMetadata httpGetEnabled =" true "/› ‹serviceDebug includeExceptionDetailInFaults =" false "//behavior› ‹›haviors›‹ / serviceHostingEnvironment aspNetCompatibilityEnabled = "true" / ›‹services›‹ поведение службыConfiguration = "DuplexServerBehavior" name = "DuplexServer" ›‹ адрес конечной точки = "" binding = "wsDualHttpBinding" contract = "DuplexServer" / ›‹ адрес конечной точки = "mex" = "mexHttpBinding" contract = "IMetadataExchange" / ›‹/service› ‹/services›‹ /system.serviceModel ›
Я установил дуплексную службу в клиентском приложении следующим образом:
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 попали в точку останова, установленную на сервере, и я могу пройти через нее.
Вызовы дуплексной службы не попадают в точки останова, хотя на клиенте не возникает никаких ошибок. Если я проверю HTTP-трафик с помощью Fiddler, я могу увидеть сотни 202 запросов, запущенных после первоначального запроса - я предполагаю, что это запросы на опрос.
Первоначальный дуплексный запрос:
POST http://localhost/CTC.Test.WCF.Server/DuplexServer.svc HTTP / 1.1 Принять: / Content-Length: 665 Content-Type: application / soap + xml; charset = utf-8 UA-CPU: x86 Accept-Encoding: gzip, deflate User-Agent: 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.30729; .NET CLR 3.0.30618) Хост: cotocovista4.cotoco.local Подключение: Keep-Alive Pragma: no-cache
‹S: Envelope xmlns: a =" http://www.w3.org/2005/08/addressing "xmlns: s =" http://www.w3.org/2003/05/soap-envelope "› ‹ s: Заголовок ›‹ a: Action s: mustUnderstand = "1" ›urn: IDuplexServer / SendEcho‹ / a: Action ›‹ netdx: Duplex xmlns: netdx = "http://schemas.microsoft.com/2008/04/ netduplex "› ‹netdx: Address› http://docs.oasis-open.org/ws-rx/wsmc/200702/anonymous?id=ae3e3139-0df8-41eb-97db-69c2c48782b7•/netdx:Адрес›‹netdx:SessionId›43f9e320-cde3-4e21-a748-e5b29c10ee25‹/netdx:SessionId›‹/netdx:Duplex›‹a:To s: mustUnderstand = "1" ›http://cotocovista4.cotoco.local/CTC.Test.WCF.Server/DuplexServer.svc‹/a:Кому›‹/s:Заголовок›‹s:Body›‹SendEcho›‹message›Сообщение!‹/Message›‹/SendEcho›‹/s:Body›‹/s:Envelope>
Последующие дуплексные запросы:
POST http://localhost/CTC.Test.WCF.Server/DuplexServer.svc HTTP / 1.1 Принять: / Content-Length: 588 Content-Type: application / soap + xml; charset = utf-8 UA-CPU: x86 Accept-Encoding: gzip, deflate User-Agent: 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.30729; .NET CLR 3.0.30618) Хост: cotocovista4.cotoco.local Подключение: Keep-Alive Pragma: no-cache
‹S: Envelope xmlns: a =" http://www.w3.org/2005/08/addressing "xmlns: s =" http://www.w3.org/2003/05/soap-envelope "› ‹ s: Заголовок ›‹ a: Действие s: mustUnderstand = "1" ›http://docs.oasis-open.org/ws-rx/wsmc/200702/MakeConnection s: mustUnderstand = " 1 "› http://cotocovista4.cotoco.local/CTC.Test.WCF.Server/DuplexServer.svc xmlns: wsmc = "http://docs.oasis-open.org/ws-rx/wsmc/200702" ›‹ wsmc: Адрес ›http://docs.oasis-open.org/ws-rx/wsmc/200702/anonymous?id=ae3e3139-0df8-41eb-97db-69c2c48782b7‹/wsmc:Address›‹/wsmc:MakeConnection›‹/s:Body›‹/s:Envelope>
Кто-нибудь знает, почему это произошло, я подумал, что наконец понял последнюю проблему, когда она перестала генерировать исключения подключения ....
С Уважением
Трис
Обновление: я попытался воссоздать это в следующих типах проектов: приложение WCF, веб-приложение, веб-проект. Мне удалось реализовать пример MS, который без проблем использует сообщения WCF для параметров дуплекса, но я искал быстрый способ сборки дуплексных веб-служб с использованием WSDL.