2010-05-12 20 views
5

Ive bir Sunucu/İstemci WCF hizmeti ve NetTcpBinding kullanan istemci ve bir geri çağırma yöntemi var. geri arama ileWCF, Dubleks geri arama, recieveTimeout NetTcpBinding

<bindings> 
     <netTcpBinding> 
     <binding name="tcp_Unsecured" receiveTimeout="00:01:00" sendTimeout="00:01:00"> 
      <security mode="None" /> 
      <reliableSession enabled="true" ordered="true" inactivityTimeout="00:10:00"/> 
     </binding> 
     </netTcpBinding> 
</bindings> 

Vekil

[System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "3.0.0.0")] 
[System.ServiceModel.ServiceContractAttribute(Namespace="http://dotnetaddict.dotnetdevelopersjournal.com/wcf.samples", ConfigurationName="AlarmServer", CallbackContract=typeof(AlarmServerCallback), SessionMode=System.ServiceModel.SessionMode.Required)] 
public interface AlarmServer 
{ 

    [System.ServiceModel.OperationContractAttribute(IsOneWay=true, Action="http://dotnetaddict.dotnetdevelopersjournal.com/wcf.samples/AlarmServer/RegisterAlarm")] 
    void RegisterAlarm(System.DateTime alarmTime, string clientName, string reminderMessage); 

    [System.ServiceModel.OperationContractAttribute(IsOneWay = true, Action = "http://dotnetaddict.dotnetdevelopersjournal.com/wcf.samples/AlarmServer/unRegisterAlarm")] 
    void unRegisterAlarm(string clientName); 

    [System.ServiceModel.OperationContractAttribute(IsOneWay = true, Action = "http://dotnetaddict.dotnetdevelopersjournal.com/wcf.samples/AlarmServer/broadcastMessage")] 
    void broadcastMessage(string msg); 
} 

[System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "3.0.0.0")] 
public interface AlarmServerCallback 
{ 

    [System.ServiceModel.OperationContractAttribute(IsOneWay=true, Action="http://dotnetaddict.dotnetdevelopersjournal.com/wcf.samples/AlarmServer/SignalAlarm")] 
    void SignalAlarm(string reminderMessage); 

    [System.ServiceModel.OperationContractAttribute(IsOneWay = true, Action = "http://dotnetaddict.dotnetdevelopersjournal.com/wcf.samples/AlarmServer/displayMessage")] 
    void displayMessage(string msg); 
} 

istemci örneği

public MainForm() 
{ 
    InitializeComponent(); 
    InstanceContext context = new InstanceContext(new AlarmCallback()); 
    client = new AlarmServerClient(context); 
} 

Ben sorun bağlayıcı recieveTimeout tetikler sonra, istemci hatalı duruma geçer olmasıdır ve dinleme müşterilerine kapatır geri aramak.

Ben sysinternals gelen TCPView kullanarak dinleme portu damla görebilirsiniz. birden fazla mesaj olarak Sunucusu/Müşteriye WCF mesajında ​​onun değil bir arıza, ok akacaktır böylece

meşgul kanalı tutarsanız, mola, tetiklemez.

Ben receiveTimeout TCP üzerinde WCF mesajdan bir cevap başarısız olursa algılamak için bir yol sağlamak için tasarlanmıştır düşündüm? Bağlantı neden hatalı? Neredeyse zaman aşımı süresinden için oluşturulan hiçbir geri arama nesnesi varsa, kanal daha sonra kapanmış görünüyor?

Neyi yanlış yapıyorum?

+0

Bunun için herhangi bir çözüm buldunuz mu? –

cevap

2

Proxy oluşturulmasında (istemci) DuplexChannelFactory kullanmayı denediniz mi? İşte (yeni AlarmServerClient kullanılarak oluşturulmasını (bağlam) değiştirin) kullanıldığı böyle yürüyor: etkinleştirerek, kanallar iletişimi analiz etmek

Olası: iz analiz etmek günlüğünü etkinleştirme:

AlarmServer proxy = new DuplexChannelFactory<AlarmServer>(context,"YourAlarmServerEndpoint").CreateChannel(); 

DÜZENLEME İleti günlüğü ve Trace:

<system.diagnostics> 
<sources> 
    <source name="System.ServiceModel.MessageLogging" switchValue="Warning, ActivityTracing"> 
    <listeners> 
     <add type="System.Diagnostics.DefaultTraceListener" name="Default"> 
     <filter type="" /> 
     </add> 
     <add name="ServiceModelMessageLoggingListener"> 
     <filter type="" /> 
     </add> 
    </listeners> 
    </source> 
    <source name="System.ServiceModel" switchValue="Information,ActivityTracing" 
    propagateActivity="true"> 
    <listeners> 
     <add type="System.Diagnostics.DefaultTraceListener" name="Default"> 
     <filter type="" /> 
     </add> 
     <add name="ServiceModelTraceListener"> 
     <filter type="" /> 
     </add> 
    </listeners> 
    </source> 
</sources> 
<sharedListeners> 
    <add initializeData="Your_svclog_file_here" 
    type="System.Diagnostics.XmlWriterTraceListener, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" 
    name="ServiceModelMessageLoggingListener" traceOutputOptions="Timestamp"> 
    <filter type="" /> 
    </add> 
    <add initializeData="Your_svclog_file_here" 
    type="System.Diagnostics.XmlWriterTraceListener, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" 
    name="ServiceModelTraceListener" traceOutputOptions="Timestamp"> 
    <filter type="" /> 
    </add> 
</sharedListeners> 
<trace autoflush="true" /> 

Bu durumda, Trace "Bilgi" kaydedebilir. Kanalların oluşturulmasını görmek önemlidir.

+0

Bunu denedim, yardımcı olmadı. Hala baffelledim !! – PrimeTSS

+0

Ive da bağlamaları basitleştirilmiş ve molalarında ve reliablesession özellikleri kurtuldum Hala çağrı geri kanal içine giden bir " Hata "durumu (neden bilmek ve bu hata hakkında daha fazla bilgi almak ister misiniz?) – PrimeTSS

+0

Günlüğü etkinleştirerek, iletişimin nerede çöktüğünü analiz edebilirsiniz. Umarım yardımcı olur! – Erup

5

görünüyor \ Program Files \ Microsoft SDK'leri \ Windows \ v6.0A \ bin \ SvcTraceViewer.exe: Genellikle C, Microsoft Windows SDK -

Service Trace Görüntüleyici kullanabilirsiniz svclog dosyasını analiz etmek Alınan süre, geri sayım ana bilgisayar hizmetinin, maksimum sayısına ulaştıktan sonra hataya neden olmasına neden olur. Hangisi 23.59 saat veya 1 dakikadır. Elimden
<bindings> 
     <netTcpBinding> 
     <binding name="NetTcpBinding_AlarmServer" receiveTimeout="infinite" > 
      <security mode="None" />   
     </binding> 
     </netTcpBinding> 
    </bindings> 

infinate ayarını receivetimeout ile zaman aşımı sorunu çözüldü Ama bu im gerçekten Sunucu/İstemci iletişimi için WFC doğru aleti kullanarak eğer beni şimdi merak vardır. Bir sunucuda/sunucuda çalışacak bir Ana Bilgisayar/Sunucu ve ona bağlı birden çok uzak istemci istiyorum. İstemci sunucuya kalp atışı ile ping atacaktır ve bazen sunucu istemciye bir komut gönderebilir. Ben remoting veya tcpsockets ile yapıyor ve bir "müşteri yoklama yöntemi" kullanılarak nerede o got o eşsiz müşteri için bekleyen komut varsa istemci, bir komut için her 10 dakika sunucusunu çağırma yapılırken bir veritabanında quued ve komutlar o.Bu, tamamen çalıştı ve istemcinin yalnızca rastgele bağlanıp bağlantısını keseceği için, sunucuya 1000 açık tcp soket bağlantısı OLMAYANIN avantajına sahipti. AMA WCF denemeye karar verdim (her şeyden sonra Remoting'in yerini alan yeni ve en yeni şey bu mu?) Ve Duplex'i bulduğumda, onu kullanmam gerektiğini düşündüm .... ŞİMDİ Ben WCF Duplux için ne anlama geldiğini düşünmüyorum ???

Burada kavramları kaçırmıyorum ???

4

ReceTimeout öğesinin ayarlandığı değer, servisin, uygulama iletisi alınmadığında iletişim kanalında hata oluşmadan önce ne kadar bekleyeceğini söyleyecektir. Bu zaman aşımı değerini her zaman daha büyük bir sayıya yükseltebilirsiniz (varsayılan değer 10 dakikadır), ancak daha sonra oturum etkinliğini zaman aşımına yükseltmeniz gerekir. Bu zaman aşımları hakkında daha fazla bilgi için lütfen http://msdn.microsoft.com/en-us/library/system.servicemodel.channels.binding.receivetimeout.aspx'a bakın.

Alma veya hareketsizlik zaman aşımı patladığında, dupleks kanal arızalı. Sunucuyla tekrar iletişim kurabilmek için istemci tarafında yeni bir proxy oluşturmalısınız.

Sunucuyu çağırmaya çalışmadan önce istemci tarafında kanal bağlantı durumunu her zaman kontrol edebilirsiniz. Kanalın CommunicationState'ı açılmazsa, sunucuyu aramadan önce yeni bir proxy oluşturabilirsiniz.