Pregunta

He creado una aplicación web con un proyecto Silverlight integrado en él, utilizando VS 2008 SP 1 y las herramientas Silverlight 3, en Vista y Windows 7.

El código de servicio dúplex:

    [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);
}

La sección de configuración dúplex:

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>

He configurado un servicio dúplex en la aplicación del cliente de la siguiente manera:

        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);

He usado un servicio simplex en conjunto con esto, y las llamadas al servicio simplex alcanzaron la configuración de los puntos de interrupción en el servidor y puedo atravesar.

Las llamadas al servicio dúplex no llegan a los puntos de interrupción, aunque no se plantea ningún error en el cliente. Si inspecciono el tráfico HTTP con Fiddler, puedo ver que se disparan cientos de 202 solicitudes después de la solicitud inicial; supongo que estas son las solicitudes de encuestas.

Solicitud de dúplex inicial:

CORREO http: //localhost/ctc.test.wcf.server/duplexserver.svc Http/1.1 aceptar: /Content-longitud: 665 Tipo de contenido: Aplicación/SOAP+XML; Charset = UTF-8 UA-CPU: x86 Aceptación de aceptación: GZIP, desinflar el agente de usuario: Mozilla/4.0 (compatible; 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) Host: Cotocovista4.Cotoco. Conexión Local: Pragma de guardia: No Cache

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/SENDECHO u003C/a:Action>u003Cnetdx:Duplex xmlns:netdx="http://schemas.microsoft.com/2008/04/netduplex">u003Cnetdx:Address>http://docs.oasis-open.org/ws-rx/wssmc/200702/anonymous?id=ae3e3139-0df8-41eb-97db-69c2c48782b7u003C/netdx:Address>u003Cnetdx:SessionId> 43F9E320-CDE3-4E21-A748-E5B29C10EE25u003C/netdx:SessionId>u003C/netdx:Duplex> S: MustUnstandand = "1">http: //cotocovista4.cotoco.local/ctc.test.wcf.server/duplexserver.svcu003C/a:To>u003C/s:Header>u003Cs:Body>u003CSendEcho>u003Cmessage> ¡Mensaje!u003C/message>u003C/SendEcho>u003C/s:Body>;

Solicitudes dúplex posteriores:

CORREO http: //localhost/ctc.test.wcf.server/duplexserver.svc Http/1.1 aceptar: /Content-longitud: 588 Tipo de contenido: Aplicación/SOAP+XML; Charset = UTF-8 UA-CPU: x86 Aceptación de aceptación: GZIP, desinflar el agente de usuario: Mozilla/4.0 (compatible; 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) Host: Cotocovista4.Cotoco. Conexión Local: Pragma de guardia: No Cache

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/wssmc/200702/makeconnectionu003C/a:Action> S: MustUnstandand = "1">http: //cotocovista4.cotoco.local/ctc.test.wcf.server/duplexserver.svcu003C/a:To>u003C/s:Header>u003Cs:Body> xmlns: wsmc = "http://docs.oasis-open.org/ws-rx/wssmc/200702">u003Cwsmc:Address>http://docs.oasis-open.org/ws-rx/wssmc/200702/anonymous?id=ae3e3139-0df8-41eb-97db-69c2c48782b7u003C/wsmc:Address>u003C/wsmc:MakeConnection>u003C/s:Body>;

¿Alguien sabe por qué sucedería esto? Pensé que finalmente había descubierto el último problema cuando dejó de lanzar excepciones de conexión ...

Saludos

Tris

ACTUALIZACIÓN: He intentado recrear esto en los siguientes tipos de proyecto: aplicación WCF, aplicación web, proyecto web. He logrado implementar el ejemplo de MS que utiliza mensajes WCF para los parámetros dúplex sin problema, pero estaba buscando una forma rápida de ensamblar servicios web dúplex utilizando WSDL.

¿Fue útil?

Solución

Entonces, logré finalmente que funcionara usando la siguiente sección de configuración web y ajustar el lado del cliente en consecuencia:

<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>

Si alguien puede explicar por qué funcionó, pero usar wsdualhttpbinding no lo hizo, eso sería realmente útil. :)

(Además, ¿por qué se muestra eso en un bloque de código?:/)

Saludos

Tristán

Otros consejos

¿Sabes si las llamadas realmente están pasando, y simplemente no alcanzan tus puntos de descanso? (Puede probar esto insertando algunos otros efectos secundarios, como iniciar sesión en un archivo de texto o algo así). Pregunto esto porque me he encontrado exactamente con el mismo problema en el pasado, donde los puntos de interrupción en los servicios Duplex WCF alojados Dentro de IIS no son golpeados, a pesar de que las llamadas se estaban haciendo. Terminé teniendo que cambiar a un servicio autohospedado para evitar el problema. Presenté esto como un error en MS, y han indicado que se resolverá en el plazo .NET 4.0/VS2010/Silverlight 4.0. Publicaría los enlaces, etc., pero no puedo encontrarlos en este momento.

Mi mejor sugerencia, si esta es una opción para usted, y si el problema es solo que los puntos de interrupción no son golpeados, es moverse a VS2010 o pasar a un servicio autohospedado.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top