2012-03-01 17 views
17

İki iletişim bağlantısına sahip bir çift Stream bağlandığım. Akışın arkasındaki temel uygulama önemli değil, Stream seviyesinde çalışmak istiyorum ...Varolan bir bağlantı akışını sarmak için WCF kullanma

Akış için kendi iletişim protokolümü uygulamak yerine, mevcut tüm WCF iyiliğini kullanmak için çift ​​yönlü (istek/cevap + geri arama) WCF iletişim kanalı ile mevcut akış.

Sorum şu ki, bunu yapmayı nasıl yapabilirim?

GÜNCELLEME:

Özel bir taşıma uygulanması yolda gittin.

ben uygun IChannelFactory ve IChannelListener birlikte akışı sarmak için bir IDuplexSessionChannel uyguladık ve bir kanal oluşturmak için Eleman Bağlama ... Bu çalışma var, ama yine de onunla tamamen mutlu değilim fabrikalar. Şimdi, sadece bağlı akıştan geçiyorum ve sonunda bunları oluşturulduğunda nakil kanalına aktarıyorum. aşağıdaki gibi

Yani, akışı üzerinden hizmete erişme için istemci proxy oluşturabilirsiniz:

var callback = new MyCallback(); 
var instanceContext = new InstanceContext(callback); 
var pipeFactory = new DuplexChannelFactory<IMyService>(instanceContext, new StreamBinding(clientStream), 
                 new EndpointAddress("stream://localhost/MyService")); 
var serviceProxy = pipeFactory.CreateChannel(); 

I gelmiş sorun, bu WCF sunucu uç oluşturmak için ServiceHost kullanılarak ayarlanır görünüyor Kanal, IChannelListener aracılığıyla. Benim durumumda, zaten bağlı bir akışım var ve daha fazla gelen bağlantıyı dinleyemem. Bu konuda çalışabilirim, ancak kanalın sunucu ucunu oluşturmak için bir ServiceHost kullanmamayı tercih ederim, çünkü çalışmasını sağlamak için bir sürü belirsiz klişe ve hack ile bitiyorum.

Sorular

Bakıyorum, bu nedenle, IDuplexSessionChannels almak ve sunucu ile istemci biter hem de bir Kanal vekil içine bu kaydırmak için daha iyi bir yol. Veya IChannelListener gerektirmeyen farklı bir ServiceHost uygulaması olabilir.

Buradaki sorun, tek bir sunucu istemiyorum, çoklu istemci düzenlemesi, WCF Hizmeti ile istemci arasında 1-1 arasında bir ilişkim var. Bunlardan birini oluşturmanın doğru bir yolu var mı?

Başka bir şekilde belirtmek gerekirse, bir ServiceHost kullanmadan Sunucu tarafı hizmet örneğini oluşturmak istiyorum.

Bu aşamada herhangi bir öneride bulunulur.

+0

Bir WCF hizmet ana bilgisayarının ve bir WCF hizmet örneğinin rolünü karıştırıyor olabilirsiniz. Bir WCF hizmet ana bilgisayarı, InstanceContextMode'a dayalı bir hizmetin örneklerini sağlar. Bu [blog yayını] (http://www.danrigsby.com/blog/index.php/2008/05/23/understanding-instancecontext-in-wcf/) bunun nasıl çalıştığına dair iyi bir açıklamaya sahiptir.Sağlayan bir ServiceHost olmadan bir WCF servisinin gerçekte bir örneğini kullanamazsınız. ServiceHost, bunun karşılığında mesajlaşma altyapısını yönetmek için bir ChannelListener'a bağımlıdır. Bu olmadan, bir "sağır" ServiceHost var :) –

+0

Yani, yapmaya çalıştığım şey bir 'InstanceContext' ve Hizmet örneği oluşturmak için 'ServiceHost' yapar. Yeni bir gelen bağlantıyı kabul ettiğinde, ServiceHost bunu yapmalıdır. Bağlantım zaten kurulmuş, bu yüzden dinleme bölümünü atlamak istiyorum. Elbette bu imkansız değil * ...? – Mark

+0

@Mark Benim için bu, mevcut bir tüneli almayı ve onu içerecek başka bir tünel inşa etmeyi seviyor… WCF bu tür şeyler için inşa edilmedi ... varolan akımla ilgili problem tam olarak nedir (yazdığınız yazıyor) WCF kullanmayı düşünelim mi? – Yahia

cevap

0

Her iki ucunda da bir istemci kullanın. Sözleşmelerinizi dikkatlice tanımlamanız gerekecek. Eğer ClientA ve ClientB, akışın her iki ucunda ise, ClientA bir talep gönderdiğinde, ClientB, geri arama sözleşmesi olarak gördüğü gibi görünmesini bekler ve bunun tersi de geçerlidir.

İlgili konular