C# 修改用户子集的传出消息
是否可以修改用户子集的传出消息 我目前正在进行原型设计,但最终的计划是我们将有两层(或更多)的用户连接到同一个集线器。集线器基本上只是重新广播客户端想要发送的任何消息 更高层的用户应该看到所有消息。较低级别的用户不应看到所有消息,而应看到某些消息的编辑版本 我正在努力找出最好的方法。我想我已经找到了答案,通过使用: (最终,过滤将需要确定有关连接用户的信息,但我还不知道) 在C# 修改用户子集的传出消息,c#,jquery,asp.net,signalr,C#,Jquery,Asp.net,Signalr,是否可以修改用户子集的传出消息 我目前正在进行原型设计,但最终的计划是我们将有两层(或更多)的用户连接到同一个集线器。集线器基本上只是重新广播客户端想要发送的任何消息 更高层的用户应该看到所有消息。较低级别的用户不应看到所有消息,而应看到某些消息的编辑版本 我正在努力找出最好的方法。我想我已经找到了答案,通过使用: (最终,过滤将需要确定有关连接用户的信息,但我还不知道) 在启动期间安装的: using Microsoft.AspNet.SignalR; using Owin; namespa
启动期间安装的
:
using Microsoft.AspNet.SignalR;
using Owin;
namespace WebApplication9
{
public class Startup
{
public void Configuration(IAppBuilder app)
{
app.MapSignalR();
GlobalHost.HubPipeline.AddModule(new MsgFilter());
}
}
}
中心看起来像:
using Microsoft.AspNet.SignalR;
namespace WebApplication9
{
public class PingHub : Hub
{
public void Send(dynamic message)
{
Clients.All.pong(message);
}
}
}
(这将最终转移到特定组内的广播,而不是所有客户端)
然后,我在MVC控制器的视图中有以下代码:
@model dynamic
@{
ViewBag.Title = "title";
}
<h2>title</h2>
<input id="message" type="text" />
<input id="send" name="send" value="Send" type="button" />
<div id="messages"></div>
@section scripts
{
<script src="~/Scripts/jquery.signalR-2.2.0.js"></script>
<script src="~/signalr/hubs"></script>
<script>
$(function () {
// Reference the auto-generated proxy for the hub.
var ping = $.connection.pingHub;
// Create a function that the hub can call back to display messages.
ping.client.pong = function (message) {
// Add the message to the page.
$('#messages').append('<li>' + htmlEncode(message) + '</li>');
};
// Start the connection.
$.connection.hub.start().done(function () {
$('#send').click(function () {
// Call the Send method on the hub.
ping.server.send($('#message').val());
// Clear text box and reset focus for next comment.
$('#message').val('').focus();
});
});
});
// This optional function html-encodes messages for display in the page.
function htmlEncode(value) {
var encodedValue = $('<div />').text(value).html();
return encodedValue;
}
</script>
}
当有人在场时,我总是抱怨,重新阅读上面的内容,我意识到我可能是在亲自在场 我们正在考虑将SignalR设置为一种通用的“事件通知”机制,既可供使用各种内部应用程序的员工使用,最终也可供供应商和客户访问 大多数活动涉及个人客户,因此计划是让访问特定客户帐户的人员加入以该客户参考号命名的组。然后,当任何人对该客户进行更改时,他们将向该组发布事件
然而,并非所有发生在客户账户上的活动都必须对外部各方可见(客户本身或我们的供应商-是否需要相同的访问规则尚未决定)。此外,并非所有与活动相关的信息都必须发布(例如,在内部,我们可能需要知道员工“Joe Blogs”刚刚发布了X,但我们可能希望将其更改为“Joe(客户服务)”,以免泄露员工的个人信息)回答第一个问题:否,我不认为您可以通过干扰广播消息的方式来根据寻址用户修改其内容(也就是说,从集线器的角度来看) 从集线器中提供的机制来看,我认为唯一的方法是跟踪连接ID,然后使用包含排除的连接ID(外部用户)列表的组调用来只处理特定用户。这是在不知道在特定情况下处理连接和重新连接有多困难的情况下说的 连接后的每个用户都将被添加到集合中,但前提是他在内部用户中。然后,内部用户需要调用一个额外的服务器方法,在该方法中,他需要被授权从排除列表中删除(从客户端触发额外授权) 向项目所有成员发送的广播信息将导致:
Clients.Group("[customer]").broadcastMessage(name, message);
如果是独家消息:
Clients.Group("[customer]", excludedIds.ToArray()).broadcastMessage(name, message);
我知道这不是一种优雅的方式。我甚至宁愿考虑我在评论中建议的团体名称公约,但我很高兴与你讨论或听到你已经考虑过这个问题。 也许您应该使用membershipprovider和roleprovider,并使用“roleprovider.IsUserInRole”根据订阅者角色修改消息。好的,
onBeforeOutbound
似乎只调用一次,因为它从管道中处理消息,从我所看到的情况来看,在这个层次上无法区分用户。国际海事组织需要在其他地方处理这种分离。我同意,为“管理员”和“客户”添加额外的组似乎不是很优雅。在首次连接/注册客户时,他或她的角色是明确的,对吗?这并不优雅,但是使用{customer name}-{external/internal}这样的约定来扁平化组名中的角色将允许在高级别上简单地路由消息。有兴趣看到更复杂的想法。@rdoubleui-是的,当连接发生时应该知道角色。你有这种方法的经验吗?想一想问题仍然存在:您会在什么时候应用对RoleProvider.IsUserInRole
的检查?我目前正在使用一个自定义用户提供程序,但我没有使用带有信号器的RoleProvider的代码示例。我会尽力让它发挥作用,然后再回来找你。我认为你不应该接受这个。我希望能就此进行讨论。
[Authorize]
public void RegisterAsTeamMember()
{
if (!IDs.Any(u => u == Context.ConnectionId))
{
IDs.Remove(Context.ConnectionId);
}
}
Clients.Group("[customer]").broadcastMessage(name, message);
Clients.Group("[customer]", excludedIds.ToArray()).broadcastMessage(name, message);