《叫魂》读后谢

发布时间:2018-10-11  栏目:法律  评论:0 Comments

《叫魂——1768年华妖术大恐慌》读了了,有局部感想记下来。

          之前的篇章介绍过Asp.net
SignalR,  ASP .NET SignalR是一个ASP .NET
下之类库,可以于ASP .NET 的Web项目中落实实时通信. 
今天咱们来落实服务端消息推送至Web端,   首先回顾一下它抽象层次图是这么的:

立刻仍开我是细嚼慢咽着读毕的,一直当经典的好写如逐渐品尝,这样才能够重好地接受。

图片 1

开之撰稿人孔飞力是相同各美国哈佛大学的教,通过对“叫魂”这同清朝社会恐慌性事件的描述,为读者切出清代社会之一个断面,从纵向、横向对同期的社会开展透视和深开掘,给咱全景式地展现出一个封建“盛世”之下,大众平民、官僚、区域经济、法律、满清政府、帝王皇权、国家运作体制当这案中的神州清代镜像。

实质上 Asp.net SignalR 2 实现 服务端消息推送到Web端, 更加简单.
为了获取更好之可伸缩性, 我们引入消息队列, 看如下基本流程图:

图片 2

信队列MQ监听, 在Web site 服务端一吸收信息,马上通过Signalr
推送广播及客户端.  创建ASP.NET MVC WEB APP,  从NuGet 安装SignalR 2.12

Install-Package Microsoft.AspNet.SignalR

切切实实实现代码,是这样的,我们加一个缺损的Hub:

    public class FeedHub : Hub

    {

        public void Init()

        {

        }

    }

 

是略的音讯模型, 标题与本文属性:

    [Serializable]

    public class PushMessageModel

    {

        public int Id { get; set; }

        public string MSG_TITLE { get; set; }

        public string MSG_CONTENT { get; set; }

    }

服务端推送具体类,记录日志, 创建信息队列实例,监听, 等待接受消息.
这里我们采用的凡AcitveMQ的.net客户端.
ActiveMQListenAdapter是一个卷入了之对象. 

    public class MQHubsConfig

    {

        private static ILogger log = new Logger("MQHubsConfig");

 

        /// <summary>

        /// Registers the mq listen and hubs.

        /// </summary>

        public static void RegisterMQListenAndHubs()

        {

            var activemq = Megadotnet.MessageMQ.Adapter.ActiveMQListenAdapter<PushMessageModel>.Instance(MQConfig.MQIpAddress, MQConfig.QueueDestination);

            activemq.MQListener += m =>

            {

                log.InfoFormat("从MQ收到消息{0}", m.MSG_CONTENT);

                GlobalHost.ConnectionManager.GetHubContext<FeedHub>().Clients.All.receive(m);

            };

 

            activemq.ReceviceListener<PushMessageModel>();

        }

    }

地方来一致句关键代码GlobalHost.ConnectionManager.GetHubContext<FeedHub>().Clients.All.receive(m); 
这里以了GetHubContext方法后,直接来播音消息.

需要在MVCApplication下加载:

    public class MvcApplication : System.Web.HttpApplication

    {

        protected void Application_Start()

        {

            AreaRegistration.RegisterAllAreas();

            FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);

            RouteConfig.RegisterRoutes(RouteTable.Routes);

            BundleConfig.RegisterBundles(BundleTable.Bundles);

            MQHubsConfig.RegisterMQListenAndHubs();

        }

    }

并且要增加一个Starup.cs, 用于Owin

[assembly: OwinStartup(typeof(RealTimeApp.Startup))]

namespace RealTimeApp

{

    public class Startup

    {

        public void Configuration(IAppBuilder app)

        {

            // Any connection or hub wire up and configuration should go here

            app.MapSignalR();

        }

    }

}

紧接下去是客户端App.js:

function App() {

    var init = function () {

        Feed();

        $.connection.hub.logging = true;

        $.connection.hub.start()

            .done(function() {

                console.log("Connected!");

                $(document).trigger("Connected");

            })

            .fail(function() { console.log("Could not Connect!"); });

    };

 

    init();

};

Feed.js 具体和SignalR.js通信, 创建名为receive的function, 与服务端对应

function Feed() {

    var chat = undefined;

 

    var init = function () {

    

        // Reference the auto-generated proxy for the hub.

        chat = $.connection.feedHub;

        // Create a function that the hub can call back to display messages.

        chat.client.receive = function (item) {

            var selector = "ul.feed-list li[data-id=" + item.Id + "]";

            if (!($(selector).length > 0)) {

                $("ul.feed-list").prepend($(".feed-template").render(item));

                $("ul.feed-list li:gt(3)").remove();

            }

 

            $.messager.show({

                title: 'Tips',

                msg: item.MSG_CONTENT,

                showType: 'show'          

            });

 

     

        };

 

        // Start the connection.

        $.connection.hub.start().done(function () {

            chat.server.init();

        });

 

    };

 

    init();

};

1.
书底开业以叙事讲故事之写法讲述了案的始发展,并丢掉来全篇的糖衣炮弹,客观、干脆利落的字,不夹杂观点、不拖拉,只请还原故事来的实地。作者说故事之品位堪称一流!

        上面的javascript代码与劳务端有通信, 具体看如下图:

2.
书中针对咱们一直觉得的“盛世”进行了揭晓,作者喻为“镀金时代”,足以见得我们直接以来“好大喜功”的民族特点,其实“盛世”一直以来只是官方的解读,当时底全员大众从中真正受益有些值得考量。作者通过大气之丁记载、区域经济前行、社会学、心理学分析结合起来进行深入挖潜,盛世之下其实难靠盛名。

       
图片 3

3.
扒宏才大略的外衣,弘历到底是哪的等同各君主,他生怎么样不为人知的秉性,以及汉化和反对于弘历敏感神经的考验,我读到了“睚眦必报”、“好大喜功”。他的中庸只是“严厉和超生之间的忽悠”。

        在Index.cshtml,  我们用引用SignalR客户端JS, 放置hubs,
这里我们运用了jsrender,  easyui.js 来见推送的消息.

4.
作者通过大气底弘历亲书的批语、当时往返奏折等巨大的史料,进行了汪洋底“田野调查”得出一手解读,而非是依赖让加工过滤后的音,这是异常值得欣赏的书写历史的学科方法。

@model dynamic

 

@section Scripts {

<link href="/Content/themes/default/window.css" rel="stylesheet" />

<link href="~/Content/themes/default/progressbar.css" rel="stylesheet" />

<link href="~/Content/themes/default/linkbutton.css" rel="stylesheet" />

<script src="~/Scripts/jquery.signalR-2.1.2.min.js"></script>

<!--Reference the autogenerated SignalR hub script. -->

<script src="~/signalr/hubs"></script>

 

<script src="~/Scripts/jsrender.js"></script>

<script src="~/Scripts/jquery.easyui.min-1.4.1.js"></script>

 

@Scripts.Render("~/Scripts/project.js")

 

    <script type="text/javascript">

        $(document).ready(function () {

            var app = new App();

        });

 

    </script>

}

 

 

<div class="row-fluid">

 

    <div class="span8">

        <div class="widget">

            <div class="widget-header">

                <h2>Feed</h2>

            </div>

            <div class="widget-content">

                <ul class="span12 feed-list"></ul>

            </div>

        </div>

    </div>

</div>

 

<script class="chat-template" type="text/x-jquery-tmpl">

    <li>

        <p>{{>Message}}</p>

    </li>

</script>

 

<script class="feed-template" type="text/x-jquery-tmpl">

    <li data-id="{{>Id}}">

        <div class="row-fluid">

 

            <div class="span8">

                <h3>{{>MSG_CONTENT}}</h3>

            </div>

        </div>

    </li>

</script>

5.
文字狱的总动员根源,社会流民、平民大众、和尚、乞丐等社会人群的钻研,以及中国习俗妖术文化中,妖术、术士、魂魄文化、房屋咒符、僧道、礼仪职事人群、乞丐等和大众平民之间的涉嫌深刻解构,里面有成百上千我们像已相识之景之共鸣。这是妖术大恐慌的社会深层根源。作者怎么比我们和好还叩问中华!

落得代码服务端引用js的Script.Render, 需要以BundleConfig.cs中加入以下代码:

6.
针对性封建官僚体系的制度的政治研究,弘历时期英才官僚圈层的运作体制,信息上报,最后对妖术恐慌案的官僚体系的镇反。实际上就是盖死伤多无辜乞丐、僧侣和办失职官员为代价,而一向无妖首,从社会顶层到老百姓乞丐的,一庙会荒诞不通过之史颇闹剧。透过现象看本质,作者利用了社会学、经济学、政治学、心理学、史学、文化解构等等各科目知识,对案子的有根源进行了剥茧抽丝、层层去,呈现出案件的真人真事面目。通篇文字简练、没有学术理论堆砌的抑郁,却渗透在每学科知识之当心分析,读来扩张认知还让人拍案叫绝,丝毫无理论的压力及错综感。结合自己瘦的学问储备,虽然我自己为能够掌握题被的情节,但可难结成自己的知识系统,精深地了解作者的角度挑选以及用分析的故。不禁让丁感叹——通识教育对我们中华是何等的必要啊。

          bundles.Add(new ScriptBundle("~/Scripts/project.js")
              .IncludeDirectory("~/Scripts/Project", "*.js", false));

7.
翻译文字犀利练达,具备相当结实的中文写、英文基础,以及广的跳学科理论知识背景。一总统国外著作、略带跨学科的学术气质的题,读来却毫发从来不语言文化的隔阂感,实属难得。

而且我们构建一个WebAPI来发送需要推送的音讯, 片断代码:

立是一律准值得一读再读的历史经典书籍。书被许多描述的场面,何况不是在游说今日华夏的各种面孔。

        /// <summary>

        /// SendMessage

        /// </summary>

        /// <param name="messagemodel">The messagemodel.</param>

        /// <returns></returns>

        [HttpPost]

        public IHttpActionResult SendMessage(PushMessageModel messagemodel)

        {

            return SendToServer(messagemodel);

 

        }

 

        /// <summary>

        /// Sends to server.

        /// </summary>

        /// <param name="messagemodel">The messagemodel.</param>

        /// <returns></returns>

        private IHttpActionResult SendToServer(PushMessageModel messagemodel)

        {

 

            if (ModelState.IsValid)

            {

                if (messageRepository.SendMessage(messagemodel))

                {

                    log.Debug("发送成功!");

                    return Ok();

                }

                else

                {

                    log.ErrorFormat("发送失败!{0}", messagemodel);

                    return Content(HttpStatusCode.ExpectationFailed, new Exception("send message error"));

                }

            }

            else

            {

                log.ErrorFormat("参数验证失败!{0}", messagemodel);

                return Content(HttpStatusCode.BadRequest, ModelState);

            }

 

        }

 

发送信息及ActiveMQ的要紧代码:

    public class MessageRepository:IMessageRepository

    {

        private static ILogger log = new Logger("MessageRepository");

 

        /// <summary>

        /// 发送消息

        /// </summary>

        /// <param name="messagemodel"></param>

        /// <returns></returns>

        public bool SendMessage(PushMessageModel messagemodel)

        {

          var activemq = new ActiveMQAdapter<PushMessageModel>(MQConfig.MQIpAddress, MQConfig.QueueDestination);

          return activemq.SendMessage<PushMessageModel>(messagemodel)>0;

        }

    }

 

假设你需要周转DEMO程序,需要构建基于ActiveMQ的音队列,  
运行效果是如此的, 我们以一个静态html中, 发送一个ajax到webapi服务端, 
发送后

图片 4

别一个website网站收到后, 列表更新, 并在右手下角弹出框

图片 5

IE的控制高出口:

HTML1300: Navigation occurred.
File: Index
[11:05:25 GMT+0800 (China Standard Time)] SignalR: Client subscribed
to hub ‘feedhub’.
[11:05:25 GMT+0800 (China Standard Time)] SignalR: Negotiating with
‘/signalr/negotiate?clientProtocol=1.4&connectionData=%5B%7B%22name%22%3A%22feedhub%22%7D%5D’.
[11:05:25 GMT+0800 (China Standard Time)] SignalR: This browser
doesn’t support SSE.
[11:05:25 GMT+0800 (China Standard Time)] SignalR: Binding to iframe’s
load event.
[11:05:25 GMT+0800 (China Standard Time)] SignalR: Iframe transport
started.
[11:05:25 GMT+0800 (China Standard Time)] SignalR: foreverFrame
transport selected. Initiating start request.
[11:05:25 GMT+0800 (China Standard Time)] SignalR: The start request
succeeded. Transitioning to the connected state.
[11:05:25 GMT+0800 (China Standard Time)] SignalR: Now monitoring keep
alive with a warning timeout of 13333.333333333332 and a connection lost
timeout of 20000.
[11:05:25 GMT+0800 (China Standard Time)] SignalR: Invoking
feedhub.Init
Connected!
[11:05:25 GMT+0800 (China Standard Time)] SignalR: Invoked
feedhub.Init
[11:07:12 GMT+0800 (China Standard Time)] SignalR: Triggering client
hub event ‘receive’ on hub ‘FeedHub’.
[11:07:18 GMT+0800 (China Standard Time)] SignalR: Triggering client
hub event ‘receive’ on hub ‘FeedHub’.
[11:07:32 GMT+0800 (China Standard Time)] SignalR: Triggering client
hub event ‘receive’ on hub ‘FeedHub’.
[11:07:51 GMT+0800 (China Standard Time)] SignalR: Triggering client
hub event ‘receive’ on hub ‘FeedHub’.
[11:09:25 GMT+0800 (China Standard Time)] SignalR: Triggering client
hub event ‘receive’ on hub ‘FeedHub’
.

上面粗体是 最后咱们发的第5长条消息控制台的输出.

 

哼了,到此刻, 由于篇幅有限, 示例代码没有任何出示,
可以当这时下载, 
需要安装ActiveMQ

 

期对君支付实时Web App有扶持.

卿可能感兴趣之篇章:

SignalR介绍与Asp.net

只要发思了解又多软件,系统 IT,企业信息化 资讯,请关注本身之微信订阅号:

图片 6

作者:Petter Liu
出处:http://www.cnblogs.com/wintersun/
正文版权归作者和博客园共有,欢迎转载,但未经作者同意要保留这个段子声明,且在文章页面明显位置于来原文连接,否则保留追究法律责任的权利。
欠篇为又披露于自己的单身博客中-Petter Liu
Blog。

留下评论