2010-11-22 31 views
2

WCF servisimdeki bir kanalı tanımlamam gerekiyor.WCF - Bazı kanal tanımlayıcıları nasıl edinilir?

Tek yol Session.SessionID kullanmaktır, ancak oturumları ile çalışmak için bağlanma görünmüyor ve oturum yapmaya çalıştığım şey için çok fazla gibi görünüyor. Sadece bir kanalın tarihini yazmaya çalışıyorum - hangi yöntemler çağrılıyor ve şu anda aktif olan "kanal kimliğinin" bir karmasını saklıyorum.

'Kanal kimliği' gibi bir şeyi nasıl alabilirim? 'Kanal kimliğinin' açıkça var olmadığını biliyorum, ancak geçici çözümler neler?

+0

Kullanım durumu nedir, bununla ne elde etmeye çalışıyorsunuz? –

+0

Yazdığım gibi - Açılırken her kanalda hangi yöntemlerin çağrıldığını izleyen kanal kimliğine dayanan bir tarih tablosunda günlüğe sahip olmaya çalışıyorum. Ayrıca, hangi kanalların açıldığını izlemek için bir yol var (bazı iş mantığı için). – veljkoz

+0

Yanılmıyorsam yazarın herhangi bir SessionMode olmaması durumunda, oturum geri aramayı veya başka bir bilgiyi geri almak için OperationContext.Current öğesine erişemez. –

cevap

2

başka hüner, ben böyle 'kandırdın' yok bir şey bu yana:

istemci tarafında Messageheader ekleyin: "Ad"

using (OperationContextScope scope = new OperationContextScope(cli.InnerChannel)) 
{ 
    OperationContext.Current.OutgoingMessageHeaders.Add(MessageHeader.CreateHeader("MyHeader", Guid.NewGuid().ToString(), "")); 

    string ret = cli.GetData(1); 
} 

başlığının mülkiyet Adını var Göndermek istediğim üstbilginin ve İsim-alanı olarak değer-taşıyıcı olarak kullanıyorum (çünkü üstbilginin bu "değerine" erişemiyorum - mülkiyet olarak gösterilmiyor mu ?!). Bir hizmet örneği oluşturduğumda, istemci tarafında bunu yapıyorum. hizmetinde

ben gibi başlığını okuyun: Kesinlikle bir hack, ama bir şey daha şık yaratmak için zaman bitti ve bu da bana 'kanal kimlik' yolunu sürdürmek için izin verir

var head = OperationContext.Current.IncomingMessageHeaders.FirstOrDefault(h => h.Name == "MyHeader"); 
string channelId = head.Namespace; 

Ben kontrol edebilirsiniz ... o çirkin çözüm ve ben bunu sevmiyorum, bu yüzden birileri daha iyi bir şey bulduğunda sevinirim ...

düzenlemek: Ben Giden/IncomingMessageProperties kullanarak çalıştı ama o kötü kokan işe yaramaz - sunucu tarafında bulunacak bir yer yok ... Muhtemelen bir şeyleri özlüyorum ...

+3

Bu, ad alanı üzerinden hatayı almadan hatayı nasıl elde edersiniz: Guid myChannelID = OperationContext.Current.IncomingMessageHeaders.GetHeader ("MyHeader", "http: // example/my-header /"); –

+0

@velijkov: Tüm Noellerim bir kerede geldi. Ty. –

0

string sessionID = OperationContext.Current.SessionId;'u denediniz mi?

+0

Eğer oturum yoksa Benim durumum - ve gerçekten seans istemiyorum. – veljkoz

+0

Oturumlar kullanmadığınız için tek yapmanız gereken geri arama adresi, çağrılan arayüz ve geçerli saattir. Senin peşinde olan bu mu? –

+0

Geri arama adresi yeterli olabilir, ancak kullanıcının/kanalın geçerli bir şekilde tanımlanacağından emin değilim? Kullanıcının hizmeti kullanan iki uygulaması varsa ne olur? – veljkoz

0

OperationContext.Current.Channel.GetHashCode() amacınıza uygun gibi geliyor.

+0

Bu her zaman her kanal için aynı Hash değerini döndürür. Bu da, kanalın diğer kanallardan farklılaştıran hiçbir şeyin bulunmadığı sonucuna götürür. – veljkoz

+0

... veya tüm talepleriniz aynı kanalda servis ediliyor mu? Hangi bağlayıcı kullanıyorsunuz? –

+0

basicHttpBinding - ancak uygulamayı yeniden başlatsam bile, kanal karma aynı kalır. – veljkoz