c# ASP.NET怎么判断客户端中的软件进程是不是运行?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c# ASP.NET怎么判断客户端中的软件进程是不是运行?相关的知识,希望对你有一定的参考价值。
这个问题你当初解决了么? 我也遇到跟你一样的需求,求大师指点
网页自身不能判断客户端的是否存在进程。类似的需求有QQ的网页快捷登录功能,它是用浏览器插件实现的,是在安装QQ客户端时注入的浏览器(可以用360之类的扫到这个浏览器插件),请求网页时由插件提交已经登录的QQ参数,而非是网页本身判断的。
也就是说,要想判断客户端本地进程,那么就必须在客户端上先安装一个东西。 参考技术A 判断不了客户端。
如何知道两个会话是不是在 ASP.NET C# 中的浏览器游戏上单击了按钮
【中文标题】如何知道两个会话是不是在 ASP.NET C# 中的浏览器游戏上单击了按钮【英文标题】:How to know if two Sessions have clicked buttons over a browser game in ASP.NET C#如何知道两个会话是否在 ASP.NET C# 中的浏览器游戏上单击了按钮 【发布时间】:2012-10-06 19:12:16 【问题描述】:两个人在不同浏览器上玩的浏览器游戏出现问题。游戏状态由使用 Game Class 的 Session 变量和玩家点击的按钮控制。游戏结束时,玩家有 3 种选择,要么重新匹配同一个玩家,要么寻找另一个玩家,要么完全断开游戏。如果玩家断开连接,游戏可以彻底销毁游戏对象并恢复所有 Session 变量。
我遇到的问题是同步玩家选择的其他两个按钮。如果两个玩家都选择了相同的按钮,那么游戏将再次进行。但是,如果一名球员想要复赛而另一名球员想再次比赛,那么意见不合的球员必须都找到新球员。
我使用了两个Session变量,PlayWithSamePlayer表示他们想和同一个玩家重赛。我还使用 ContinueChoicesMade 来确保两个玩家都选择相同的选项。如果 ContinueChoicesMade 为假,则表示两个玩家不同意,并被放回我的游戏管理器以搜索其他玩家。 我可以弄清楚如何在我的 Game 类中使用我的两个玩家同步方法,以便可以听到两个玩家的动作。目前,如果我运行游戏,当它到达我的方法时,它会以 NullException 的形式出现。
我希望在游戏结束时,一个玩家选择一个按钮,浏览器等待另一个浏览器点击一个按钮,然后检查他们按下的是否相同,然后是否相同;游戏继续进行,如果他们点击的内容不同;游戏继续进行。在玩家点击重新匹配或找到新玩家后,同步 Session 变量的最佳方法是什么。下面是我在游戏类中处理两个玩家的方法,也是我的 aspx.cs 页面上调用的方法。
((Game)Session["Game"]).RoundOverSynchronizing(Session);//when should I call this out? this is not apart of the game class.
public void RoundOverSynchronizing(HttpSessionState player)
if (((bool)player1["PlayWithSamePlayer"]) == true
&& ((bool)player2["PlayWithSamePlayer"]) == true)
player1["ContinueChoicesMade"] = true;
player2["ContinueChoicesMade"] = true;
else if (((bool)player1["PlayWithSamePlayer"]) == false
&& ((bool)player2["PlayWithSamePlayer"]) == false)
player1["ContinueChoicesMade"] = true;
player2["ContinueChoicesMade"] = true;
else
player1["ContinueChoicesMade"] = false;
player2["ContinueChoicesMade"] = false;
【问题讨论】:
会话数据不共享。使用相同的正确共享> - 即not Session,not ViewState,not static - 资源来传输这个状态与游戏状态的 rest 一样。也就是说,“继续”游戏与“玩”游戏时做出选择/移动没有什么不同。 上面的方法在运行游戏的游戏类中。它采用的参数是将信息发送到游戏类的浏览器会话,然后它将 2 个会话分为玩家 1 和玩家 2。当确保检查我的 ContinueChoicesMade 会话变量时,我感到很困惑。只有当两个玩家点击不同的按钮时才为假 会话数据在客户端之间不共享>。我对这应该如何工作感到困惑..如果使用了一些神奇的棍子,那么它应该在上下文中显示。 是的,它不共享,但我可以测试是否设置了会话变量。 Session 变量定义了游戏当前所处的状态。每个浏览器都有自己的 Session 状态,当 Session 变量存在时,它将进行游戏,否则游戏将不知道下一步要做什么和去哪里。 Session 变量只能在浏览器发出的请求中使用正确的 SessionId 访问。您的服务器端只能在他的请求中访问玩家 1 的会话,玩家 2 也是如此。因此,如果您不打算将这些变量存储在其他地方,您如何将它们放入相同的上下文中进行比较?关于同步的事情,如果你不想使用彗星解决方案,你可以在玩家的下一个请求中处理。 【参考方案1】:我认为在这里使用 Session 不是一个好主意。 (而且我认为您不能/不应该从另一个线程读取会话的数据。也许我错了) 我认为您应该将这些数据存储在至少具有 2 种实体的数据库(SQL/NoSQL)中:
一个有 2 个 SessionId 用于匹配记录 一个包含玩家的 SessionId 和他们的选择因此您可以存储他们的选择并检查他们是否会参加复赛。 假设您有某种投票或彗星解决方案,如果重赛条件成功,则会创建一个桌子/游戏室,如果玩家拒绝,则会显示一条消息。
【讨论】:
【参考方案2】:如果您想访问共享的数据,您需要使用数据存储(如另一个答案中提到的 SQL),或者您可以将信息存储在应用程序缓存中。在这种情况下,您要做的是创建一个 Game 类来管理整个游戏,然后为各个用户添加/删除会话。
【讨论】:
我认为“缓存”在这里是不合适的。缓存非常适合存储可能在其他地方可用的东西——关键字是可能。在可能非常特别配置的环境之外,没有任何保证。使用 SQL(或其他保证持久性机制)是可行的方法。 我不明白你在说什么关于缓存。为什么“可能”不在缓存中? 术语cache 通常用于指代数据可能并不总是可用的临时存储(出于各种原因:驱逐、传播、非持久重启、范围/位置、竞争条件等),主要目的是加快对数据的访问 - 不是存储数据。因此,我不会为此目的依赖“缓存”。 (不同的缓存 - 例如一个非常特定的配置 - 可能会或可能不会在特定环境中提供更强大的保证。) Application Cache: 使用应用程序缓存的模式是在您访问某个项目时确定该项目是否存在于缓存中,如果存在[存在],以使用它。 如果该项目不存在,您可以重新创建该项目,然后将其放回缓存中。 这种模式确保您始终拥有缓存中的最新数据。 -- 也就是说,通常不保证应用程序缓存将包含所需的值。 是的,我认为作为最佳实践,这不是一个明智的选择,即使在我的建议中,这个想法也是不要使用您不能承受丢失的信息。感谢您的链接以上是关于c# ASP.NET怎么判断客户端中的软件进程是不是运行?的主要内容,如果未能解决你的问题,请参考以下文章
使用 C# 在 ASP.NET 中检查 SQL Server 表中的列值是不是为空