Вопрос

Я создал веб-приложение с помощью проекта 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, либо перейти к самообслуживаемому обслуживанию.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top