2009-04-02 32 views
12

Tôi phải làm gì để kích hoạt sự kiện khi một khách hàng mới kết nối với dịch vụ lưu trữ WCF?Sự kiện cháy khi khách hàng kết nối với điểm cuối lưu trữ WCF

EDIT: Điều tôi đang tìm kiếm là có được sự kiện khi tạo phiên mới hoặc Kênh mới được tạo cho khách hàng. Chẳng hạn như: đối với phiên đóng cửa tôi đang sử dụng:

OperationContext.Current.Channel.Closed += new EventHandler(Channel_Closed); 

vì vậy tôi nên sử dụng gì cho phiên iitiation?

Trả lời

5

Tôi nghĩ rằng những gì bạn đang cố gắng để hoàn thành được thực hiện tốt nhất bằng cách thêm một mới channel initializer cho người nghe dịch vụ (s) sau khi được tạo ra.

Về cơ bản, bạn tạo một lớp thực hiện giao diện đó, sau đó bạn thêm nó vào máy chủ dịch vụ. Nếu bạn đang tự lưu trữ điều này khá đơn giản:

public class MyHook : IChannelInitializer 
{ 
    public void Initialize(IClientChannel channel) 
    { 
    // Do whatever. 
    } 
} 

var host = new ServiceHost(typeof(MyService), MYBASEADDRESS); 
host.AddServiceEndpoint(typeof(IMyService), new WSHttpBinding(), MYSERVICEADDRESS); 
host.Open(); 

// There will be one per endpoint; you can enumerate them if needed etc. 
var dispatcher = host.ChannelDispatchers[0] as ChannelDispatcher; 
dispatcher.ChannelInitializers.Add(new MyHook()); 

Vì bạn đang sử dụng chế độ dụ phiên, bạn sẽ tạo kênh mới cho mỗi phiên mới, lần đầu tiên khách hàng kết nối. Điều phối kênh là đối tượng chịu trách nhiệm lấy kênh mới được tạo và liên kết nó với một cá thể đối tượng dịch vụ cụ thể (không khớp địa chỉ, v.v.). Nó sẽ chạy từng bộ khởi tạo tùy chỉnh trên kênh mới trước khi dịch vụ của bạn được kết nối với nó.

+0

Cảm ơn! Điều đó trả lời chính xác câu hỏi của tôi – galets

+0

Để biết thêm thông tin, hãy xem: http://blogs.msdn.com/b/carlosfigueira/archive/2012/02/14/wcf-extensibility-initializers-instance-context-channel-call-context. aspx Đặc biệt đối với WCF 4.0, cách đề xuất sẽ không hoạt động vì ngoại lệ được ném sau khi Máy chủ được chuyển sang trạng thái mở –

0

Tùy thuộc vào thiết lập của bạn - bạn có thực hiện cuộc hội thoại "cho mỗi cuộc gọi" không? Sau đó, bạn không thực sự nhận được bất kỳ thông báo "khách hàng hiện được kết nối" nào trên mỗi se ....

Bạn có thực hiện các cuộc trò chuyện theo phiên không? Lớp "ServiceHost" của bạn có hai sự kiện "Mở" và "Đã mở", mà bạn có thể nối vào, đặc biệt nếu bạn tự lưu trữ dịch vụ của mình.

Chính xác bạn muốn đạt được điều gì bằng cách bẫy sự kiện này?

Marc

+2

Dựa trên phiên. Máy chủ lưu trữ kích hoạt sự kiện đã mở khi máy chủ dịch vụ khởi động, ví dụ: trên máy chủ lưu trữ.Open() gọi, không phải khi khách hàng mới kết nối – galets

+1

bạn có lời khuyên nào nếu đó là InstanceContextMode.Single không? – arconaut

Các vấn đề liên quan