WCF (Silverlight) Duplex - Не попал на сервер - PullRequest
2 голосов
/ 04 марта 2010

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

Ответы [ 2 ]

1 голос
/ 09 марта 2010

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

<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 - нет, это было бы очень полезно. :)

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

Привет

Тристан

0 голосов
/ 04 марта 2010

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

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

...