WCF (Silverlight) Duplex - не ударяет сервер
-
24-09-2019 - |
Вопрос
Я создал веб-приложение с помощью проекта 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);
}
Раздел Duplex Config:
u003Csystem.serviceModel>n u003Cbehaviors>n u003CserviceBehaviors>n u003Cbehavior name="DuplexServerBehavior">n u003CserviceMetadata httpGetEnabled="true" />n u003CserviceDebug includeExceptionDetailInFaults="false" />n u003C/behavior>n u003C/serviceBehaviors>n u003C/behaviors>n u003CserviceHostingEnvironment aspNetCompatibilityEnabled="true" />n u003Cservices>n u003Cservice behaviorConfiguration="DuplexServerBehavior" name="DuplexServer">n u003Cendpoint address="" binding="wsDualHttpBinding" contract="DuplexServer" />n u003Cendpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />n u003C/service>n u003C/services>n u003C/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 Service в Tandem с этим, и вызовы на Simplex Service попали на настройку точки останова на сервере, и я могу пройти.
Вызывы в дуплексную службу не попадают в точку останова, хотя на клиенте не поднимается ошибка. Если я проверю HTTP-трафик с помощью Fiddler, я могу видеть сотни 202 запросов после первоначального запроса - я предполагаю, что это опрос запросов.
Начальный дуплекс Запрос:
СООБЩЕНИЕ http: //localhost/ctc.test.wcf.server/duplexserver.svc. Http / 1.1 Принять: /Длина содержимого: 665 Тип содержимого: Приложение / SOAP + XML; CHARSET = UTF-8 UA-CPU: X86 ACCOD-CODINGING: GZIP, Devlate 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 Connection: Хранить живую прагму: NO-CACE
u003Cs:Envelope xmlns:a="http://www.w3.org/2005/08/addressing" xmlns:s="http://www.w3.org/2003/05/soap-envelope">u003Cs:Header>u003Ca:Action s:mustUnderstand="1"> URN: IDUPLEXSERVER / SEDECHO u003C/a:Action>u003Cnetdx:Duplex xmlns:netdx="http://schemas.microsoft.com/2008/04/netduplex">u003Cnetdx:Address>http://docs.oasis-open.org/ws-rx/wsmc/200702/Anonymous?id=ae3e3139-0DF8-41EB-97DB-69C2C48782B7.u003C/netdx:Address>u003Cnetdx:SessionId> 43F9E320-CDE3-4E21-A748-E5B29C10EE25u003C/netdx:SessionId>u003C/netdx:Duplex> S: MustunderStand = "1">http: //cotocovista4.cotoco.local/ctc.test.wcf.server/duplexserver.svc.u003C/a:To>u003C/s:Header>u003Cs:Body>u003CSendEcho>u003Cmessage> Сообщение!u003C/message>u003C/SendEcho>u003C/s:Body>;
Последующие дуплексные запросы:
СООБЩЕНИЕ http: //localhost/ctc.test.wcf.server/duplexserver.svc. Http / 1.1 Принять: /Длина содержимого: 588 Тип содержимого: Приложение / SOAP + XML; CHARSET = UTF-8 UA-CPU: X86 ACCOD-CODINGING: GZIP, Devlate 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 Connection: Хранить живую прагму: NO-CACE
u003Cs:Envelope xmlns:a="http://www.w3.org/2005/08/addressing" xmlns:s="http://www.w3.org/2003/05/soap-envelope">u003Cs:Header>u003Ca:Action s:mustUnderstand="1">http://docs.oasis-open.org/ws-rx/wsmc/200702/makeConnection.u003C/a:Action> S: MustunderStand = "1">http: //cotocovista4.cotoco.local/ctc.test.wcf.server/duplexserver.svc.u003C/a:To>u003C/s:Header>u003Cs:Body> xmlns: wsmc = "http://docs.oasis-open.org/ws-rx/wsmc/200702">u003Cwsmc:Address>http://docs.oasis-open.org/ws-rx/wsmc/200702/Anonymous?id=ae3e3139-0DF8-41EB-97DB-69C2C48782B7.u003C/wsmc:Address>u003C/wsmc:MakeConnection>u003C/s:Body>;
Кто-нибудь знает, почему это произойдет, я подумал, что наконец-то высунул последнюю проблему, когда она перестала бросать исключения соединения ....
С уважением
Трис
Обновление: Я попытался воссоздать это в следующих типах проекта: приложение WCF, веб-приложение, веб-проект. Мне удалось реализовать пример MS, который использует WCF-сообщение для дуплексных параметров без проблем, но я искал быстрый способ собрания дуплексных веб-сервисов с использованием WSDL.
Решение
Итак, мне удалось наконец-то работать, используя следующие раздел веб-конфигурации и соответственно настраивая сторона клиента:
<system.serviceModel>
<extensions>
<bindingElementExtensions>
<add name="pollingDuplex"
type="System.ServiceModel.Configuration.PollingDuplexElement, System.ServiceModel.PollingDuplex"/>
</bindingElementExtensions>
</extensions>
<bindings>
<customBinding>
<binding name="DuplexConfig">
<binaryMessageEncoding/>
<pollingDuplex maxPendingSessions="2147483647" maxPendingMessagesPerSession="2147483647" inactivityTimeout="02:00:00" serverPollTimeout="00:05:00"/>
<httpTransport/>
</binding>
</customBinding>
</bindings>
<behaviors>
<serviceBehaviors>
<behavior name="CTC.Test.WCF.Server.DuplexServiceBehavior">
<serviceMetadata httpGetEnabled="true"/>
<serviceDebug includeExceptionDetailInFaults="true"/>
<serviceThrottling maxConcurrentSessions="2147483647"/>
</behavior>
</serviceBehaviors>
</behaviors>
<services>
<service behaviorConfiguration="CTC.Test.WCF.Server.DuplexServiceBehavior" name="CTC.Test.WCF.Server.DuplexService">
<endpoint address="" binding="customBinding" bindingConfiguration="DuplexConfig" contract="CTC.Test.WCF.Server.IDuplexService"/>
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
</service>
</services>
</system.serviceModel>
Если кто-то может объяснить, почему это сработало, но с помощью WSDualHttpbinding не сделал, это было бы действительно полезно. :)
(Кроме того - почему отображается в блоке кода?: /)
С уважением
Тристан
Другие советы
Знаете ли вы, если вызовы на самом деле проходят, и просто не ударяет ваши точки останова? (Вы можете проверить на это, вставляя некоторые другие побочные эффекты, такие как вход в текстовый файл или что-то в этом роде.) Я спрашиваю это, потому что я столкнулся со одной и той же проблемой в прошлом, где проводятся точки останова на WCF Duplex Hears Внутри IIS не поражен, хотя звонки делали. Я оказался, что должен был перейти на самоуверенную службу, чтобы обойти эту проблему. Я подал это как ошибку в MS, и они указали, что она будет решена в .NET 4.0 / VS2010 / Silverlight 4.0 TimeFrame. Я бы опубликую ссылки и т. Д., Но я не могу найти их прямо сейчас.
Мое лучшее предложение, если это вариант для вас, и если проблема заключается в том, что точки останова не получают удара, либо переместить на VS2010, либо перейти к самообслуживаемому обслуживанию.