Tôi đã xây dựng một ứng dụng với Silverlight4, RIA Services và tôi đang sử dụng ASP.NET Membership để xác thực/ủy quyền.Dịch vụ Silverlight RIA - Làm thế nào để xử lý tốt nhất Client Auth Session Timeout?
web.config của tôi có này:
<system.web>
<sessionState timeout="20"/>
<authentication mode="Forms">
<forms name="_ASPXAUTH" timeout="20"/>
</authentication>
Tôi đã đọc một số chiến lược khác nhau về cách đối phó với thời gian chờ auth/phiên trên các mặt hàng. Đó là: nếu máy khách không hoạt động trong x phút (20 ở đây), và sau đó họ làm điều gì đó với giao diện người dùng kích hoạt cuộc gọi RIA/WCF, tôi muốn bẫy vào sự kiện đó và xử lý một cách thích hợp (ví dụ: đưa họ trở lại màn hình đăng nhập) - Tóm lại: Tôi cần một cách để phân biệt với một DomainException phía máy chủ đang tồn tại và một lỗi auth vì phiên đã hết thời gian chờ.
AFAIK: không có ngoại lệ hoặc thuộc tính được nhập có thể xác định điều này. Cách duy nhất tôi đã có thể xác định điều này - mà có vẻ như một hack: là để kiểm tra chuỗi tin nhắn của lỗi và tìm kiếm một cái gì đó như "Truy cập bị từ chối" hoặc "bị từ chối". Ví dụ: một cái gì đó như thế này:
if (ex.Message.Contains("denied"))
// this is probably an auth failure b/c of a session timeout
Vì vậy, đây là những gì tôi đang làm, và nó hoạt động nếu tôi chạy và gỡ lỗi với built-in máy chủ từ VS2010, hoặc nếu tôi chạy trong localhost IIS . Nếu tôi đặt thời gian chờ là 1 phút, hãy đăng nhập, chờ hơn một phút và kích hoạt một cuộc gọi khác, tôi sẽ phân tích ngoại lệ và nhập khối mã nếu ở trên và tất cả đều tốt.
Sau đó, tôi triển khai ứng dụng đến máy chủ IIS7 từ xa và tôi thử cùng một thử nghiệm và nó không hoạt động. Vì vậy, tôi đã thêm log truy tìm, và đây là sự kiện mà các ngoại lệ đã xảy ra:
<E2ETraceEvent xmlns="http://schemas.microsoft.com/2004/06/E2ETraceEvent">
<System xmlns="http://schemas.microsoft.com/2004/06/windows/eventlog/system">
<EventID>131076</EventID>
<Type>3</Type>
<SubType Name="Error">0</SubType>
<Level>2</Level>
<TimeCreated SystemTime="2011-10-30T22:13:54.6425781Z" />
<Source Name="System.ServiceModel" />
<Correlation ActivityID="{20c26991-372f-430f-913b-1b72a261863d}" />
<Execution ProcessName="w3wp" ProcessID="4316" ThreadID="24" />
<Channel />
<Computer>TESTPROD-HOST</Computer>
</System>
<ApplicationData>
<TraceData>
<DataItem>
<TraceRecord xmlns="http://schemas.microsoft.com/2004/10/E2ETraceEvent/TraceRecord" Severity="Error">
<TraceIdentifier>http://msdn.microsoft.com/en-US/library/System.ServiceModel.Diagnostics.TraceHandledException.aspx</TraceIdentifier>
<Description>Handling an exception.</Description>
<AppDomain>/LM/W3SVC/1/ROOT/sla-2-129644844652558594</AppDomain>
<Exception>
<ExceptionType>System.ServiceModel.FaultException`1[[System.ServiceModel.DomainServices.Hosting.DomainServiceFault, System.ServiceModel.DomainServices.Hosting, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35]], System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</ExceptionType>
<Message></Message>
<StackTrace>
at System.ServiceModel.DomainServices.Hosting.QueryOperationBehavior`1.QueryOperationInvoker.InvokeCore(Object instance, Object[] inputs, Object[]& outputs)
at System.ServiceModel.DomainServices.Hosting.DomainOperationInvoker.Invoke(Object instance, Object[] inputs, Object[]& outputs)
at System.ServiceModel.Dispatcher.DispatchOperationRuntime.InvokeBegin(MessageRpc& rpc)
at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage5(MessageRpc& rpc)
at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage31(MessageRpc& rpc)
at System.ServiceModel.Dispatcher.MessageRpc.Process(Boolean isOperationContextSet)
</StackTrace>
<ExceptionString>System.ServiceModel.FaultException`1[System.ServiceModel.DomainServices.Hosting.DomainServiceFault]: (Fault Detail is equal to System.ServiceModel.DomainServices.Hosting.DomainServiceFault).</ExceptionString>
</Exception>
</TraceRecord>
</DataItem>
</TraceData>
</ApplicationData>
</E2ETraceEvent>
Vấn đề là tôi không có chuỗi trong thông báo lỗi cho biết "bị từ chối" hoặc "Truy cập bị từ chối" - và Tôi không chắc chắn là tại sao giải pháp này hoạt động trong localhost IIS hoặc VS2010 lưu trữ nhưng không phải trong một máy chủ IIS7 từ xa. Có một số thiết lập cấu hình tối nghĩa mà tôi đang thiếu ở đây không? Có cách nào tốt hơn để làm điều này nói chung?
Cảm ơn - đây chính xác là những gì tôi đang tìm kiếm. Tôi đã đi xuống tùy chọn 3 được liệt kê trên blog đó, nhưng vẫn chưa có thời gian để làm cho nó đúng. Điều này sẽ làm việc cho tôi. – zenocon