2010-05-07 25 views
5

Tôi có một ứng dụng WCF đang sử dụng phiên.WCF: Làm cách nào để biết thời điểm phiên kết thúc?

Có sự kiện trung tâm nào bị ném khi phiên kết thúc không? Làm thế nào tôi có thể tìm hiểu khi nào một phiên kết thúc WITHOUT (!) Gọi một phương thức (ngắt kết nối mạng, máy khách bị lỗi - vì vậy không có lệnh gọi "đăng xuất")?

Các máy chủ được lưu trữ như:

[ServiceBehavior(
    InstanceContextMode = InstanceContextMode.PerSession, 
    ConcurrencyMode = ConcurrencyMode.Reentrant, 
    UseSynchronizationContext = false, 
    IncludeExceptionDetailInFaults = true 
)] 

Về cơ bản bởi vì nó được sử dụng một giao diện gọi lại.

Bây giờ, tôi về cơ bản cần phải decoubple instance được tạo ra từ các cửa hàng phụ trợ khi phiên giao dịch kết thúc;)

Bất kỳ ý tưởng?

Trả lời

4

Có một mô tả tốt về bối cảnh dụ here

Instance bối cảnh xuất phát từ CommunicationObject

đối tượng truyền thông có một sự kiện closing.

Tôi chưa tự làm điều này, nhưng về mặt lý thuyết, có thể sử dụng sự kiện này để tách khỏi cửa hàng phụ trợ khi phiên kết thúc, bằng cách móc vào sự kiện này.

-1

Đặt giá trị thời gian chờ của bạn và tạo phương thức PingService() phát trước khi hết thời gian chờ, thao tác này sẽ đặt lại thời gian chờ Gửi và nhận.

nếu bạn muốn ghi thời gian chờ chỉ đơn giản là thử gọi lại, nếu nỗ lực mất nhiều thời gian hơn giá trị SendTimeout ràng buộc (mặc định là 1 phút tôi nghĩ), thì bạn sẽ ném một lỗi hết thời gian và bạn có thể xử lý ngắt kết nối.

Không có cách nào để một cách duyên dáng bắt một người sử dụng bị ngắt kết nối (bị treo trình duyệt, cúp điện, vv, vv, vv)

+0

câu trả lời không đúng - tôi đã có (ping/giây, v.v.) - không dừng máy khách khỏi bị DEAD vì hết thời gian trên mạng hoặc mất điện hoặc thứ gì đó mà tôi muốn/cần nắm bắt (Tức là tôi cần biết khi nào kết nối đã chết/phiên kết thúc). Đây cũng không phải là trình duyệt liên quan (tại sao mọi người lại nghĩ một dịch vụ web là một trang web nhàm chán ngu ngốc?). Đây không phải là phía khách hàng tham gia ở đây cả - câu hỏi của tôi là 100% phía máy chủ. -1. – TomTom

+0

Bạn có thể thử điều này: callbackClient.opContext.Channel.State. – DavyMac23

8
[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession)] 
class MyService : IService 
{ 
    public MyService() 
    { 
     // Session opened here 
     OperationContext.Current.InstanceContext.Closed += InstanceContext_Closed; 
     // get the callback instance here if needed 
     // OperationContext.Current.GetCallbackChannel<IServiceCallback>() 
    } 

    private void InstanceContext_Closed(object sender, EventArgs e) 
    { 
     // Session closed here 
    } 
} 

Mã sẽ không làm việc cho đơn/PerCall InstanceContextMode.

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