如何在经过身份验证的会话超时时处理 Silverlight 中的 WCF 服务错误

     2023-05-07     243

关键词:

【中文标题】如何在经过身份验证的会话超时时处理 Silverlight 中的 WCF 服务错误【英文标题】:How to Handle WCF Service Error in Silverlight When Authenticated Session Times Out 【发布时间】:2011-01-15 19:00:29 【问题描述】:

我有一个正在 Silverlight 中访问的 WCF 服务。 Silverlight 应用程序需要身份验证(通过调用服务进行身份验证。)

我注意到,当经过身份验证的会话超时并且用户在应用程序端执行了一些会调用服务的操作时,应用程序只是挂起等待服务响应。我的服务旨在在这些情况下输出异常,但是 Silverlight 端没有分配任何内容,而是引发异常:

CommunicationException 未被用户代码处理

远程服务器返回错误:NotFound。

在我的服务方法中,我检查用户是否仍然通过身份验证,如果是,我继续操作。如果不是,我将一个值分配给一个输出参数(异常类型)。在 Silverlight 方面,我检查此异常是否为空,否则采取适当的措施。当我执行时,out 参数被赋予了正确的异常,但随后 Silverlight 抛出了上述异常(在 Reference.cs 中),甚至在它到达我可以处理的地步之前......

还有其他人看过吗?有什么建议吗?

编辑:似乎有任何类型的异常,包括继承和包含它们,都会导致上述异常。我发现解决此问题的最简单方法是在我自己的自定义 Exception 对象中传递异常信息(同样不能包含 System.Exception 对象)

【问题讨论】:

【参考方案1】:

更多信息的想法和要求:

您已针对控制台应用检查了 WCF 服务,并且一切正常?

您可以从 Silverlight 应用程序对 WCF 服务进行调用,并且这种行为仅在经过身份验证的会话超时后发生?

您是否在 Silverlight 应用程序的整个生命周期中保持与 WCF 的连接保持打开状态?如果是这样,我建议只根据需要打开和关闭它。这样,您应该只在会话通过身份验证时调用它。

【讨论】:

感谢您的回复。回答您的问题: 1. 我检查了 WCF 服务,是的。我什至逐行浏览了代码(更多详细信息在我的后续评论中......) 2. 是的 - 只有当用户由于会话超时而不再经过身份验证时(或者如果我创建另一个窗口,浏览我自动登录的站点,然后退出,然后返回到保持原始登录状态的另一个窗口...) 3. 该服务仅创建并用作需要,否则丢弃。 事件流程是这样的:1. Silverlight 发出请求,2. WCF 接收到请求,并开始执行。 3. WCF 检测到会话不再处于活动状态,并分配异常,并返回空值。 4. 我的 silverlight 应用程序有代码来检查异常,或者使用返回的值,但是这个代码永远不会执行,因为我之前提到的异常甚至在达到异步“完成”方法之前就被抛出了。我已经通过所有代码逐行验证了这一点。用户通过身份验证后一切正常。 我很难过。 :) 我很想知道这个问题最终是如何解决的。我会学到东西的! :)【参考方案2】:

在您的服务中启用 WCF 日志记录并查看输出内容。它通常比“NotFound”提供更多信息。以下是有关如何配置 WCF 日志记录的一些信息:http://msdn.microsoft.com/en-us/library/ms730064.aspx

【讨论】:

【参考方案3】:

在这里看看我的回答:

Random "Not Found" error with Silverlight accessing ASP.NET Web Services

这适用于 asmx 服务,但同样适用于 WCF 服务。 WCF 错误不会传递到 silverlight 应用程序。它只是从响应中获取 404 状态代码。

【讨论】:

这篇 msdn 文章介绍了如何在 Silverlight 中处理 WCF 错误。希望能帮助到你。 msdn.microsoft.com/en-us/library/dd470096(VS.96).aspx【参考方案4】:

这个网站似乎解释了我的经历: Understanding WCF Services in Silverlight

显然,Silverlight 对于任何异常都会收到 400 错误,但不会知道这个异常是什么。

作者提供了一个解决方案,但我有点困惑,因为我得到的异常不是被抛出,而是被分配。我认为我的实现会奏效...任何人都可以提供任何见解吗?

【讨论】:

【参考方案5】:

除非为您正在访问的 WCF 服务定义了特殊的端点行为(请参阅http://msdn.microsoft.com/en-us/library/dd470096(VS.95).aspx),否则浏览器网络堆栈会将所有 Web 服务异常转换为 404 - 这就是您所观察到的。

所以你有两个选择:

如果您可以修改 WCF 服务的行为,则可以按照上面链接中的说明添加端点。

如果您无法修改 WCF 服务的行为,您可以通过将以下行添加到 App.xaml.cs 文件来切换到客户端网络堆栈:

HttpWebRequest.RegisterPrefix("https://", WebRequestCreator.ClientHttp); HttpWebRequest.RegisterPrefix("http://", WebRequestCreator.ClientHttp);`

这将确保您在 Silverlight 中得到实际错误而不是 404。

显然切换到客户端网络堆栈有其自身的缺点(例如,您必须自己处理身份验证、缓存、cookie)

【讨论】:

WCF 需要配置为返回 HTTP 200 错误。 好吧,通过从浏览器网络堆栈切换到客户端堆栈,您失去了网络堆栈提供给您的一些功能(例如身份验证、缓存、cookie) 您必须决定是否要处理Silverlight(因此您自己处理这些其他方面)或免费拥有这些其他功能(因此无法处理故障)

使用 scrapy 获取 crawlspider 来处理经过身份验证(登录)的用户会话

】使用scrapy获取crawlspider来处理经过身份验证(登录)的用户会话【英文标题】:Usingscrapygettingcrawlspidertoworkwithauthenticated(loggedin)usersession【发布时间】:2013-07-1110:05:03【问题描述】:你好,我怎样才能让我的爬虫工作,我可以登... 查看详情

如何在会话超时时关闭所有活动的引导模式?

】如何在会话超时时关闭所有活动的引导模式?【英文标题】:Howtocloseallactivebootstrapmodalsonsessiontimeout?【发布时间】:2013-08-0110:20:27【问题描述】:我需要在用户空闲时拨打电话并通过会话超时,这将关闭所有Bootstrap模式。激活... 查看详情

如何在不重置 tomcat 会话超时的情况下执行经过身份验证的 AJAX 请求?

】如何在不重置tomcat会话超时的情况下执行经过身份验证的AJAX请求?【英文标题】:HowdoIexecuteanauthenticatedAJAXrequestwithoutresettingthetomcat\'ssessiontimeout?【发布时间】:2011-06-1713:59:45【问题描述】:我有一个现有的GrailsWeb应用程序正... 查看详情

会话超时时如何自动刷新

】会话超时时如何自动刷新【英文标题】:Howtoautorefreshwhensessiontimeout【发布时间】:2016-02-0919:29:35【问题描述】:我正在尝试在会话超时时自动刷新页面。我看过其他帖子,但我认为我们不是同一个问题。我有会话输出代码:$i... 查看详情

身份验证服务器超时时的 Http 状态码

】身份验证服务器超时时的Http状态码【英文标题】:Httpstatuscodeifauthservertimesout【发布时间】:2018-09-2411:28:59【问题描述】:假设我们正在从我们的服务器启动oauth流并且提供程序超时。我们返回什么作为状态码?503表示稍后重... 查看详情

Asp.Net MVC 2中会话超时时的确认

...数据,如果用户选择No则它​​会注销其会话。我想知道如何捕获剩余的两分钟以及如何在不丢失表单数据的情况下刷新当前会话。我使用带有JQuery的As 查看详情

gwt中会话超时时触发方法调用

】gwt中会话超时时触发方法调用【英文标题】:Triggerthemethodcallwhenthesessiontimeoutingwt【发布时间】:2015-07-3007:07:45【问题描述】:我想检测会话超时并在GWT的服务器端触发方法调用。是否可以?我的想法是,当会话在服务器端超... 查看详情

HttpServletRequest 在经过身份验证的 IDP 并重定向到 SP 后返回空会话

】HttpServletRequest在经过身份验证的IDP并重定向到SP后返回空会话【英文标题】:HttpServletRequestreturnsnullsessionafterauthenticatedIDPandredirectedtoSP【发布时间】:2020-01-3103:01:41【问题描述】:我正在Wildfly8.1.0中设置OKTASAML2.0与Struts1.0的集成... 查看详情

来自 laravel 会话登录的经过身份验证的 api 调用。可能吗?

】来自laravel会话登录的经过身份验证的api调用。可能吗?【英文标题】:Authenticatedapicallsfromlaravelsessionlogin.Isitpossible?【发布时间】:2019-10-2500:16:13【问题描述】:所以我只是在寻找我正在寻找的东西时遇到了问题。所以我习惯... 查看详情

使用 Facebook 的访问令牌在 UIWebView 中显示带有经过身份验证的用户会话的粉丝页面

】使用Facebook的访问令牌在UIWebView中显示带有经过身份验证的用户会话的粉丝页面【英文标题】:DisplayingafanpageinaUIWebViewwithanauthenticatedusersessionusingFacebook\'saccesstoken【发布时间】:2013-03-0909:01:12【问题描述】:我们正在开发一款... 查看详情

会话超时时,如何从 Spring Security 向 angularjs 应用程序发送响应?

】会话超时时,如何从SpringSecurity向angularjs应用程序发送响应?【英文标题】:Howdoisendaresponsefromspringsecuritytoanangularjsappwhensessionistimedout?【发布时间】:2015-02-2120:45:05【问题描述】:事先对我的英语感到抱歉。我目前正在开发一... 查看详情

会话超时时创建一个新的 ASP.NET_SessionId

】会话超时时创建一个新的ASP.NET_SessionId【英文标题】:CreateaNewASP.NET_SessionIdwhenSessionTimesOut【发布时间】:2018-12-2517:08:53【问题描述】:我想在我的网站上的会话超时时创建一个全新的ASP.NET_SessionId。我认为会话超时时触发的事... 查看详情

在 feathersjs 中使用 JWT 进行身份验证和会话处理

】在feathersjs中使用JWT进行身份验证和会话处理【英文标题】:AuthenticationandsessionhandlingusingJWTinfeathersjs【发布时间】:2020-05-1520:08:47【问题描述】:我们正在使用feathersjs-https://feathersjs.com/一个用于实时应用程序和RESTAPI的框架。... 查看详情

XCTest 中未保留经过身份验证的 Vapor 会话

】XCTest中未保留经过身份验证的Vapor会话【英文标题】:AuthenticatedVaporsessionnotpreservedinsideanXCTest【发布时间】:2020-05-2910:43:44【问题描述】:应用程序本身运行良好,但我无法进行确认这一点的测试。在下面的第1部分中,测试检... 查看详情

Ktor:如何在路由处理程序中检查身份验证?

】Ktor:如何在路由处理程序中检查身份验证?【英文标题】:Ktor:Howtocheckauthenticationinsidearoutehandler?【发布时间】:2018-11-1510:08:28【问题描述】:我正在使用ktorv0.9.2,我想根据用户是否经过身份验证,为同一路由发送不同的内容... 查看详情

使用basic身份验证创建会话(代码片段)

...生时,没有会话存在,因为这将由servlet创建。有谁知道如何解决这个问题?答案经过一夜的睡眠[1],我相信自己已经想出了一个有效的解决方案。下面的代码片段(使用JAX-RS,但是将它转换为普通的servlet代码应该不会太难)如... 查看详情

django 会话密钥在身份验证时更改

...问题描述】:我有一个Django应用程序,它记录用户对两个经过身份验证的用户的产品选择。如果用户决定稍后注册,我的意图是使用request.session.session_key变量将匿名数据与用户相关联,例如这篇文章:Djangostoringano 查看详情

如何存储firebase身份验证会话

】如何存储firebase身份验证会话【英文标题】:Howtostorefirebaseauthenticationsession【发布时间】:2021-11-1415:05:52【问题描述】:我有一个使用firebase身份验证在vue中制作的Web应用程序。这里的问题是我每次重新加载页面都需要登录。... 查看详情