目录

对SignalR不了解的人可以直接移步下面的目录

SignalR系列目录

前言

前段时间一直有人问我 在用SignalR 2.0开发客服系统[系列1:实现群发通讯]这篇文章中的"/Signalr/hubs"这个虚拟目录到底是做什么的?

由于小弟当时也是一知半解所以很牵强,这段时间特意抽空详细了解了一番,分享如下:

正文

前面我们一直都说这个是一个虚拟目录,那么这个东西到底是来做什么的呢?

我们先解释一下:这个路径前面的/Signalr/是目前你所有的SignalR的Hub在客户端连接时所访问的服务地址,后面的"/hubs"则是将要下载的前端JS资源,当我们在Startup类中app.MapSignalR()注册SignalR的时候,这个地址将自动注册,当然也可以改成自定义的代码(对应的前端JS地址也需要更改为""GoJJSMD/hubs"")如下:

    public class OwinStartup
{
public void Configuration(IAppBuilder app)
{
    //注册地址为"GoJJSMD" 
app.MapSignalR("/GoJJSMD", new HubConfiguration());
}
}

效果如下:

看到这里,大家应该已经很明确了,其实就是在SignalR在收到第一个URL请求的时候会根据hub中的代码动态的创建一个JS脚本放在这个目录里面(注:这种动态创建只会在第一次访问时发生一次),

如下图,我们可以看到我们在Hub中所写的方法全部在自动生成的Hub.js中有代理项:

说到这里,大家应该很明确了,这个虚拟目录的作用其实就是在程序第一次被访问的时候自动根据被访问的Hub动态生成的JS脚本所存放的地方.

这样还是会有弊端,比如:生成的JS没有进行优化处理(去除空格多余的字符串什么的),也无法进行CDN加速..

那么,作为一个高端大气上档次的应用程序,在用户日益暴增的今天,在必须装逼装到位的当下!,必须使用CDN对自己的JS下载进行优化,是吧.(- -,哈哈哈...)

接下来我们就讲讲如何进行CDN加速

CDN加速优化

上面我们说过,这些JS都是自动生成,所以进行JS的最小化优化和CDN加速的时候就很困难.

那么有没有办法让这些JS手动生成,并且由我们来进行控制呢?答案是肯定的~

Signalr提供了手动生成的工具,需要Nuget下载,

在Nuget命令行中输入如下命令:

Install-Package Microsoft.AspNet.SignalR.Utils

下载最新版本的Utils工具包

然后我们输入命令:

signalr ghp /path:SignalRApplication_Test/bin /o:SignalRApplication_Test/scripts/hubs.js

注意标红的地方,改为你自己的应用程序名称

这样我们就可以在Scripts/目录下看到一个叫hubs.js的文件了,如下图:

可以打开看看和之前自动生成的是一毛一样的.

那么这个JS怎么使用呢?

我们先修改前端的引用代码,如下:

<script src="Scripts/jquery-1.10.2.min.js"></script>
<script src="Scripts/jquery.signalR-2.2.0.min.js"></script>
<script src="Scripts/hubs.js"></script>
<!--这里我们注释掉-->
<!--<script src="GoJJSMD/hubs"></script>-->

把虚拟目录注释掉,然后引入我们刚刚生成的Hub.js

接下来,修改Startup类中的配置如下:

    public class OwinStartup
{
public void Configuration(IAppBuilder app)
{ //配置自动生成JS代理为否
app.MapSignalR(new HubConfiguration()
{
EnableJavaScriptProxies = false
}); }
}

然后访问页面,会发现和之前的效果没有任何区别,这样就完成了对虚拟目录的替换工作.

既然已经获得了JS,那么获得JS之后,如何进行CDN加速如何进行优化...我就不谈了..你们懂的..

虽然到此,我们就已经可以进行自己的CDN加速了但是在开发的过程中,还是会很麻烦,每次修改hub都需要手动生成一次hubs.js

有没有简便的方法呢?,那必须的..

我们在项目目录下找找..

会发现如下程序:

在packages下找到SignalR.Utils中的tools里面有一个signalr的exe程序,这个就是生成Hubs.js的小工具啦~

为了简便,我们把他复制出来,放在项目中的signalr目录下,如图:

然后我们在应用程序上,右键,属性,如下:

选择生成事件,点击编辑后期生成事件,如下图:

输入如下命令行:

$(ProjectDir)signalr\signalr.exe ghp path:$(TargetDir) /o:$(ProjectDir)Scripts/hubs.js

这样我们每当我们重新生成或者编译的时候就会自动更新Scripts下的hubs.js了..

至此,详解完毕..

写在最后

其实SignalR的功能不仅限于聊天,可能是国内的实例都是聊天的Demo所以有点限制大家的思维,大家可以想想,Signalr的时效性,其实还可以做事实的项目监控,同步的画板,甚至在HTML5下理论上完全是可以实现视频聊天的,希望大家多多支持小弟,谢谢,如果喜欢或者觉得有用,可以点一个赞,同时也欢迎大神吐槽.!小弟的Q:524808775

Signalr系列之虚拟目录详解与应用中的CDN加速实战的更多相关文章

  1. linux基础之LSB定义的常用目录详解

    Linux基础之LSB定义的基本目录详解 1.LSB中FHS(Filesystem Hierarchy Standard)定义的一些文件 /boot:主要是存放引导文件的目录,比如内核文件(vmlin ...

  2. ASP.NET MVC深入浅出系列(持续更新) ORM系列之Entity FrameWork详解(持续更新) 第十六节:语法总结(3)(C#6.0和C#7.0新语法) 第三节:深度剖析各类数据结构(Array、List、Queue、Stack)及线程安全问题和yeild关键字 各种通讯连接方式 设计模式篇 第十二节: 总结Quartz.Net几种部署模式(IIS、Exe、服务部署【借

    ASP.NET MVC深入浅出系列(持续更新)   一. ASP.NET体系 从事.Net开发以来,最先接触的Web开发框架是Asp.Net WebForm,该框架高度封装,为了隐藏Http的无状态模 ...

  3. jdk目录详解及其使用方法

    jdk目录详解 jdk目录详解 JDK(Java Development Kit,Java开发包,Java开发工具)是一个写Java的applet和应用程序的程序开发环境.它由一个处于操作系统层之上的 ...

  4. Server.MapPath()目录详解

    最近在做相关的开发,碰到了Server.MapPath(),顺便来温习一下 Server.MapPath()获取网站的目录详解  ./当前目录 /网站主目录 ../上层目录 ~/网站虚拟目录 如果当前 ...

  5. 虚拟DOM详解

    虚拟DOM简介 Virtual Dom可以看做一棵模拟了DOM树的JavaScript对象树,其主要是通过vnode,实现一个无状态的组件,当组件状态发生更新时,然后触发Virtual Dom数据的变 ...

  6. Linux and Oracle常用目录详解

    目录详解 目录 内容 / 根目录,一切从这里开始 /bin 包含系统启动和运行所必需的二进制文件(程序) /boot 包含Linux内核.最初的RAM磁盘映像(系统启动时,驱动程序会用到),以及启动加 ...

  7. Linux /proc目录详解

    Linux系统上的/proc目录是一种文件系统,即proc文件系统.与其它常见的文件系统不同的是,/proc是一种伪文件系统(也即虚拟文件系统),存储的是当前内核运行状态的一系列特殊文件,用户可以通过 ...

  8. 9.proc目录下的文件和目录详解

    1./proc目录下的文件和目录详解 /proc:虚拟目录.是内存的映射,内核和进程的虚拟文件系统目录,每个进程会生成1个pid,而每个进程都有1个目录. /proc/Version:内核版本 /pr ...

  9. Hexo系列(三) 常用命令详解

    Hexo 框架可以帮助我们快速创建一个属于自己的博客网站,熟悉 Hexo 框架提供的命令有利于我们管理博客 1.hexo init hexo init 命令用于初始化本地文件夹为网站的根目录 $ he ...

随机推荐

  1. KMP算法求解

    // KMP.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include<iostream> using namespac ...

  2. jQuery学习之路(4)- 动画

    ▓▓▓▓▓▓ 大致介绍 通过jQuery中基本的动画方法,能够轻松地为网页添加非常精彩的视觉效果,给用户一种全新的体验 ▓▓▓▓▓▓ jQuery中的动画 ▓▓▓▓▓▓ show()和hide()方法 ...

  3. 计算机程序的思维逻辑 (60) - 随机读写文件及其应用 - 实现一个简单的KV数据库

    57节介绍了字节流, 58节介绍了字符流,它们都是以流的方式读写文件,流的方式有几个限制: 要么读,要么写,不能同时读和写 不能随机读写,只能从头读到尾,且不能重复读,虽然通过缓冲可以实现部分重读,但 ...

  4. 【Reading Note】算法读书杂记

    1 排序 排序基本信息 稳定性:排序前大的数在排序后,大的数依然保持不变就是稳定排序,反之不稳定 内外排序:根据待排序的记录是否放在内存里面区分的.诸如:插入排序(直接插入&希尔).交换排序( ...

  5. PHP与JAVA构造函数的区别

    早期的PHP是没有面向对象功能的,但是随着PHP发展,从PHP4开始,也加入了面向对象.PHP的面向对象语法是从JAVA演化而来,很多地方类似,但是又发展出自己的特色.以构造函数来说,PHP4中与类同 ...

  6. LINQ to SQL Where条件

    1. 适用场景 实现条件的过滤和查询等功能. 2. 说明 跟SQL语句中的where作用相似,都起到了范围的限定即过滤的作用,而判断条件是紧跟后面的条件子句.where主要分为三种形式:简单形式.条件 ...

  7. Android—自定义开关按钮实现

    我们在应用中经常看到一些选择开关状态的配置文件,做项目的时候用的是android的Switch控件,但是感觉好丑的样子………… 个人认为还是自定义的比较好,先上个效果图:

  8. java中的内部类总结

    内部类不是很好理解,但说白了其实也就是一个类中还包含着另外一个类 如同一个人是由大脑.肢体.器官等身体结果组成,而内部类相当于其中的某个器官之一,例如心脏:它也有自己的属性和行为(血液.跳动) 显然, ...

  9. 数据库 DML、DDL、DCL区别 .

    总体解释: DML(data manipulation language): 它们是SELECT.UPDATE.INSERT.DELETE,就象它的名字一样,这4条命令是用来对数据库里的数据进行操作的 ...

  10. CYQ.Data V5 从入门到放弃ORM系列:教程 - Log、SysLogs两个日志类使用

    Log 静态类介绍: Public Static (Shared) Methods GetExceptionMessage 获取异常的内部信息 WriteLogToDB Overloaded. 将日志 ...