GVKun编程网logo

为什么System.Net.WebSockets不基于事件?

5

这篇文章主要围绕为什么System.Net.WebSockets不基于事件?展开,旨在为您提供一份详细的参考资料。我们将全面介绍为什么System.Net.WebSockets不基于事件?,同时也会为

这篇文章主要围绕为什么System.Net.WebSockets不基于事件?展开,旨在为您提供一份详细的参考资料。我们将全面介绍为什么System.Net.WebSockets不基于事件?,同时也会为您带来api – Backbone.sync – 使用ajax和Socket.IO/WebSockets的集合、asp.net-mvc – 为什么Visual Studio 2010混合了System.Web和System.Web.Abstractions?、asp.net-mvc – 如何修复System.Net.Sockets.SocketException、c# System.Net.Sockets =》TcpListener用法的实用方法。

本文目录一览:

为什么System.Net.WebSockets不基于事件?

为什么System.Net.WebSockets不基于事件?

WebSockets基于TCP套接字,因此它们实现了与之相同的逻辑。当套接字关闭并且您有一个等待接收的循环时,它将收到0个字节并继续,因此,如果在每次接收后检查套接字是否关闭,您将立即知道它,如下所示:

[Nest] 76497   - 10/23/2020,10:40:47 AM   [NestFactory] Starting Nest application...
[Nest] 76497   - 10/23/2020,10:40:47 AM   [InstanceLoader] AppModule dependencies initialized +11ms
[Nest] 76497   - 10/23/2020,10:40:47 AM   [RoutesResolver] AppController {}: +5ms
[Nest] 76497   - 10/23/2020,10:40:47 AM   [RouterExplorer] Mapped {,GET} route +2ms
[Nest] 76497   - 10/23/2020,10:40:47 AM   [RouterExplorer] Mapped {/numbers,GET} route +1ms
[Nest] 76497   - 10/23/2020,10:40:47 AM   [NestApplication] Nest application successfully started +1ms
NumbersQuery { numbers: [ 1,2 ] }

api – Backbone.sync – 使用ajax和Socket.IO/WebSockets的集合

api – Backbone.sync – 使用ajax和Socket.IO/WebSockets的集合

我有一个Backbone应用程序,它有一个名为Links的集合.链接映射到/ api / links的REST API URI.

API将为用户提供最新的链接.但是,我有一个系统,当用户点击此API时,会向消息队列添加一个作业,请求更新数据库中的链接.

完成此工作后,我会将新链接推送到Backbone集合.

我该怎么做?在我看来,我有两个选择:

>从Backbone集合中,长时间轮询API以获取新链接
>设置WebSockets以在作业完成时向集合发送“消息”,并使用它发送新数据
>为我的应用程序废弃REST API,只使用WebSockets来处理所有事情,因为我可能会在以后有更多的实时需求

带有REST API的WebSockets

如果我使用WebSockets,我不确定将其集成到我的Backbone集合中的最佳方法,以便它与REST API一起工作.

目前我的Backbone集合看起来像这样:

var Links = Backbone.Collection.extend({
  url: '/api/links'
});

我不确定如何启用Backbone集合来处理AJAX和WebSockets.我是否继续使用默认的Backbone.sync进行CRUD Ajax操作,然后手动处理单个WebSocket连接?在我脑海里:

var Links = Backbone.Collection.extend({
  url: '/api/links',initialize: function () {
    var socket = io.connect('http://localhost');
    socket.on('newLinks',addLinks)
  },addLinks: function (data) {
    // Prepend `data` to the collection
  };
})

问题

我应该如何实现我的实时需求,从上面的选项或你有任何其他想法?请提供代码示例以提供一些上下文.

别担心! Backbone.WS让你满意.

您可以初始化WebSocket连接,如:

var ws = new Bakcbone.WS('ws://exmaple.com/');

并将模型绑定到它:

var model = new Backbone.Model();
ws.bind(model);

然后,此模型将使用ws:消息类型侦听消息事件,您可以调用model.send(data)通过该连接发送数据.

当然,收藏也是如此.

Backbone.WS还提供了一些工具,用于将类似自定义REST的API映射到模型/集合.

asp.net-mvc – 为什么Visual Studio 2010混合了System.Web和System.Web.Abstractions?

asp.net-mvc – 为什么Visual Studio 2010混合了System.Web和System.Web.Abstractions?

Visual Studio 2010似乎混淆了上面提到的库.

此代码示例来自Steven Sanderson的“Pro ASP.NET MVC2 Framework”一书.

[TestMethod]
public void HomePage_Recognizes_New_Visitor_And_Sets_Cookie() 
{
    // Arrange: First prepare some mock context objects
    var mockContext = new Mock<HttpContextBase>();
    var mockRequest = new Mock<HttpRequestBase>();
    var mockResponse = new Mock<HttpResponseBase>();

    // The following lines define associations between the different mock objects
    // (i.e. tells Moq what alue to use for tMockContext.Request)
    mockContext.Setup(x=> x.Request).Returns(mockRequest.Object);
    mockContext.Setup(x=> x.Response).Returns(mockResponse.Object);
    mockRequest.Setup(x=> x.Cookies).Returns(new HttpCookieCollection());
    mockResponse.Setup(x=> x.Cookies).Returns(new HttpCookieCollection());

    var homeController = new HomeController();
    var requestContext = new RequestContext(mockContext.Object,new RouteData());
    homeController.ControllerContext = new ControllerContext(requestContext,homeController);

    // Act
    ViewResult viewResult = homeController.HomePage();

    // Assert
    Assert.AreEqual(String.Empty,viewResult.ViewName);
    Assert.IsTrue((bool)viewResult.ViewData["IsFirstVisit"]);
    Assert.AreEqual(1,homeController.Response.Cookies.Count);
    Assert.AreEqual(bool.TrueString,homeController.Response.Cookies["HasVisitedBefore"].Value);
}

我的项目引用了System.Web和System.Web.Abstractions库.

当代码文件只是“使用System.Web”时,我得到两个错误:

>(‘Assert’一词下的第25行)’System.Web.HttpResponseBase’类型在未引用的程序集中定义.您必须添加对程序集’System.Web.Abstractions,Version = 3.5.0.0,Culture = neutral,PublicKeyToken = 31bf3856ad364e35’的引用.
>(第25行和第26行,单词’Cookies’)’System.Web.HttpResponseBase’不包含’Cookies’的定义,也没有扩展方法’Cookies’接受’System.Web.HttpResponseBase’类型的第一个参数可以找到(你错过了使用指令或程序集引用吗?)

如果我将“使用System.Web.Abstractions”添加到代码文件并构建项目,上面的错误消失但后来我收到以下错误:

>名称空间’System.Web’中不存在类型或命名空间名称’Abstractions'(您是否缺少程序集引用?)

有趣的是,在两种情况下,当我在Response之后放置一个点时,Intellisense会提示我正确的选择(即Response.Cookies).似乎Intellisense有关于HttpResponseBase的信息,而构建引擎却没有.

知道可能导致这种情况的原因吗?

解决方法

你能仔细检查一下你的Project References中你有System.Web和System.Web.Abstractions吗?

使用从Apress站点下载的书籍的源代码,我可以毫无错误地构建您的代码,但是当我删除对System.Web.Abstractions的引用时,我会得到相同的行为,包括您注意到的intellisense信息提示.

asp.net-mvc – 如何修复System.Net.Sockets.SocketException

asp.net-mvc – 如何修复System.Net.Sockets.SocketException

我正在开发一个ASP.NET MVC网站,它已安装在三个不同的服务器上(相同的代码版本),它可以在两个服务器上运行,即用户可以登录,但是在用户提交了用户名和密码,浏览器中显示以下服务器错误:

Security Exception

System.Security.SecurityException: Token not found

发生错误的环境的事件查看器在用户尝试登录时显示以下两条错误消息:

Could not init pool.
System.Net.sockets.socketException (0x80004005): 
A connection attempt Failed because the connected party did not properly
respond after a period of time,or established connection Failed because 
connected host has Failed to respond (server ip address)

而这个错误:

Error: System.Security.SecurityException: Token not found

这是浏览器中显示的服务器错误.过去通过删除身份验证cookie解决了这个问题,但这不适用于此错误.

我已经尝试将web.config中的信任级别设置为full,但这不起作用.我试过重启IIS.

有没有其他人遇到类似的问题?可能是因为某种服务没有运行而导致此问题?任何建议将不胜感激.

解决方法

大多数情况下,由于尝试通信的两台服务器/计算机之间的IP协议(IPV4 / IPV6)不同,或者在其中一台计算机上设置额外的身份验证规则以进行传出或传入连接,这些都是连接超时.
解决问题的方法:

>查看IIS日志
>查看EventLogs
>尝试调整注册表中的TCP / IP参数以增加允许连接的时间

http://msdn.microsoft.com/en-us/library/aa560610(d=printer,v=bts.20).aspx

尽管上面的文章引用了Windows 2003,但我发现它适用于某些2008环境.

c# System.Net.Sockets =》TcpListener用法

c# System.Net.Sockets =》TcpListener用法

 private TcpListener _listener;
#region
初始化 listener public override void Init() { try { DevInfo.Read(); var localaddr = IPAddress.Parse(Ip); var port = Convert.ToInt32(port); _listener = new TcpListener(localaddr, port); } finally { StatusChangedEvent?.Invoke(Status); } } #endregion

开始运行

public override void Start()
        {
            Init();
            _listener?.Start();
            Task.Factory.StartNew(MonitTcpClientConnect);           
        }

监听

private void MonitTcpClientConnect()
        {
            while (true)
            {
                try
                {
                    var client = _listener.AcceptTcpClient();
                    Task.Factory.StartNew(MonitorRecvData, client);
                }
                catch
                {
                    _listener.Stop();
                    _listener = null;                return;
                }
            }
        }

处理事件

private void MonitorRecvData(object obj)
        {
            try
            {
                var tcpClient = obj as TcpClient;
                if (tcpClient == null)
                {
                    return;
                }

                var buffer = new byte[1024];var stream = tcpClient.GetStream();
                while (true)
                {
                    var count = stream.Read(buffer, 0, buffer.Length);

                    if (count == 0)
                    {
                        throw new Exception("客户端下线");
                    }

                    var str = Encoding.ASCII.GetString(buffer, 0, count);
                }
            }
            catch
            {
                // ignored
            }
        }

 

关于为什么System.Net.WebSockets不基于事件?的介绍现已完结,谢谢您的耐心阅读,如果想了解更多关于api – Backbone.sync – 使用ajax和Socket.IO/WebSockets的集合、asp.net-mvc – 为什么Visual Studio 2010混合了System.Web和System.Web.Abstractions?、asp.net-mvc – 如何修复System.Net.Sockets.SocketException、c# System.Net.Sockets =》TcpListener用法的相关知识,请在本站寻找。

本文标签: