WCF (Silverlight) Duplex - сервер не попадает

Я создал веб-приложение со встроенным в него проектом 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.


person Community    schedule 04.03.2010    source источник


Ответы (2)


Итак, мне удалось наконец заставить его работать, используя следующий раздел веб-конфигурации и соответствующим образом настроив клиентскую сторону:

<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 не помогло, это было бы действительно полезно. :)

(Также - почему это отображается в блоке кода?: /)

С Уважением

Тристан

person Community    schedule 09.03.2010
comment
ВОПРОС: Также - при использовании этого метода кажется, что поддерживается открытое соединение, а не массовый спам 202, который я получал с помощью wsDualHttpBinding. Это правильно? Это засасывает пул соединений? И есть ли способ напрямую использовать эту опцию PollingDuplexBinding? - person ; 09.03.2010

Знаете ли вы, действительно ли звонки проходят и просто не попадают в точки останова? (Вы можете проверить это, вставив некоторые другие побочные эффекты, такие как запись в текстовый файл или что-то в этом роде.) Я спрашиваю об этом, потому что в прошлом я сталкивался с точно такой же проблемой, когда точки останова на дуплексных службах WCF размещались в IIS не попадают, даже если звонки были сделаны. В итоге мне пришлось переключиться на автономный сервис, чтобы обойти проблему. Я зарегистрировал это как ошибку в MS, и они указали, что она будет решена в сроки .NET 4.0 / VS2010 / Silverlight 4.0. Я бы разместил ссылки и т. Д., Но сейчас не могу их найти.

Мое лучшее предложение, если это вариант для вас, и если проблема заключается только в том, что точки останова не достигаются, - либо перейти на VS2010, либо перейти на автономную службу.

person Ken Smith    schedule 04.03.2010
comment
Я поместил исключения в конструктор DuplexServer и во все веб-методы и ожидал, что это приведет к критическому сбою где-нибудь, но все равно это продолжалось. Однако я не проводил никакого отслеживания. Я разберусь с этим. - person ; 04.03.2010
comment
Хорошо - я добавил трассировку, и точно не попадает. - person ; 04.03.2010
comment
Хорошо - я использовал веб-приложение и переключился на веб-проект с помощью InstanceContextMode.SingleInstance. Теперь он один раз попадает в конструктор класса обслуживания (в других режимах экземпляра этого не происходит). Но это все равно не попадает в сообщения участников. - person ; 05.03.2010
comment
Хмммм. . . Вы пытались избавиться от одностороннего сервиса и получить доступ только к дуплексному сервису? У меня была такая же договоренность в моем текущем проекте в какой-то момент, но это вызывало множество трудностей, поэтому я перевел все на одну дуплексную службу, и это, похоже, помогло. Возможно, стоит попробовать. - person Ken Smith; 05.03.2010
comment
Да, я удалил симплексную службу. Я также пробовал это с множеством проектов - веб-приложение, веб-проект и проект WCF. По-прежнему безуспешно. - person ; 08.03.2010
comment
Я также создал веб-службы, используя как реализацию интерфейса, так и реализацию без интерфейса, и по-прежнему ничего не выходит с сервера. - person ; 08.03.2010
comment
Я также пробовал этот проект на двух разных компьютерах, одном Vista и одном Windows 7. Те же результаты. - person ; 08.03.2010