最近在学习SignalR服务器实时推技术,写了个Demo,普通的Asp.netWeb应用程序,IIS访问地址为http://localhost/SignalR_Test/Paint.html,用VS自带的IISExpress测试没有任何问题,在部署到IIS之后就出问题了。

加载页面时弹出JS报错:无法获取未定义或 null 引用的属性“client”,$.connection访问

Hub-Proxy返回一个null对象。

IIS版本为IIS8,检查应用程序池,Framework4.0,集成模式。IIS部署没有问题。

使用IE自带的抓包工具发现在获取signalr/Hubs时,返回404:

发现请求地址中应用程序名称SignalR_Test不见了,直接在IE中访问http://localhost/SignalR_Test/signalr/hubs能得到hubs返回的js文件

检查代码,hubs的引用路径前部的“/”去掉后,SignalR正常运行!

最后说一下这个Demo,是个类似以前人人网的一个你画我猜的社交类游戏。

CSS渣,各位自重。。。

画画者页面:

答题者页面:

代码:

Paint.html:

<!DOCTYPE html>
<html lang="zh-CN">
<head><meta charset="utf-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><title>你画我猜网页版</title><style>.left, .center, .right {float: left;height: 600px;}.left, .right {background-color: lightgrey;width: 230px;font-family: 'Microsoft YaHei';color: brown;}.center {width: 804px;}.left .ctop {height: 50px;}.left .cbottom {height: 550px;}.left .cbottom .subanswer {padding-top: 15px;text-align: center;}.control-ops {background-color: burlywood;padding-top: 69px;text-align: center;}.btnCss {background-color: yellow;color: red;}#ans {width: 150px;}#user {color: coral;}#cntusers {color: darkorchid;text-align: center;}</style>
</head>
<body><div class="left"><div class="ctop">画题:<label id="subject"></label></div><div class="cbottom"><div>答案:<input id="ans" /></div><div class="subanswer"><input type="button" id="subAnswer" class="btnCss" value="提交" /></div></div></div><div class="center"><div><canvas id="myCanvas" width="800" height="500" style="border:2px solid #6699cc"></canvas><img id="img1" width="800" height="500" style="display:none" /></div><div class="control-ops"><button type="button" class="btnCss" οnclick="javascript:clearArea();return false;">清空画板</button>画笔直径 : <select id="selWidth"><option value="1">1</option><option value="3">3</option><option value="5">5</option><option value="7">7</option><option value="9" selected="selected">9</option><option value="11">11</option></select>颜色 : <select id="selColor"><option value="black">black</option><option value="blue" selected="selected">blue</option><option value="red">red</option><option value="green">green</option><option value="yellow">yellow</option><option value="gray">gray</option></select><input type="button" id="sendmessage" class="btnCss" value="完成画画" /></div></div><div class="right"><div>欢迎你,<label id="user"></label>!</div><div>用户列表:<label id="cntusers"></label></div></div><script src="Scripts/jquery-1.10.2.min.js"></script><script src="Scripts/jquery-ui-1.11.4.min.js"></script><script src="Scripts/jquery.signalR-2.1.2.js"></script><script src="signalr/hubs"></script><script>//窗口最大化self.moveTo(0, 0);self.resizeTo(screen.availWidth, screen.availHeight);var mousePressed = false;var lastX, lastY;var ctx;var uName;$(function () {while (uName == "" || uName == null) {uName = prompt("Enter your name:", "");}$("#user").text(uName);var tname = $("#user").text();//--------------------提供服务器调用--------------------//// Declare a proxy to reference the hub.var chat = $.connection.paintHub;// Create a function that the hub can call to broadcast messages.chat.client.broadcastAnswer = function (data) {$("#subject").text(data);};chat.client.broadcastHostName = function (data) {if (tname != data) {//猜的人$("#subject").text('****(' + $("#subject").text().length + '个字)');$('#myCanvas').css("display", "none");$('#img1').css("display", "");}else {//画的人$('#ans').css("display", "none");$('#subAnswer').css("display", "none");}};chat.client.getAllUser = function (data) {$("#cntusers").text('');var parsedJson = jQuery.parseJSON(data);$.each(parsedJson, function (cnt, item) {$("#cntusers").append("<div>" + item.Name + "</div>");});};chat.client.broadcastMessage = function (imgData) {// Add the message to the page.$("#img1").attr("src", imgData);$("#img1").css("display", "");$("#myCanvas").css("display", "none");};chat.client.checkAnswer = function (data, name) {if (data != "") {alert('恭喜【' + name + '】猜中答案!');location.reload()}else {if (tname == name)alert('很遗憾,你没有猜中!');}};//--------------------主动发送服务器---------------------//// Start the connection.$.connection.hub.start().done(function () {//新增用户chat.server.addPeople(uName);//获取谜底chat.server.getAnswer();//获取画画者chat.server.getPeopleName();//发送图片$('#sendmessage').click(function () {// Call the Send method on the hub.var c = document.getElementById("myCanvas");var imgURI = c.toDataURL("image/jpg");chat.server.send(imgURI);});//提交答案$('#subAnswer').click(function () {// Call the Send method on the hub.var answer = $("#ans").val();chat.server.checkAnswer(uName, answer);});});ctx = document.getElementById('myCanvas').getContext("2d");$('#myCanvas').mousedown(function (e) {mousePressed = true;Draw(e.pageX - $(this).offset().left, e.pageY - $(this).offset().top, false);});$('#myCanvas').mousemove(function (e) {if (mousePressed) {Draw(e.pageX - $(this).offset().left, e.pageY - $(this).offset().top, true);}});$('#myCanvas').mouseup(function (e) {mousePressed = false;});$('#myCanvas').mouseleave(function (e) {mousePressed = false;});});function Draw(x, y, isDown) {if (isDown) {ctx.beginPath();ctx.strokeStyle = $('#selColor').val();ctx.lineWidth = $('#selWidth').val();ctx.lineJoin = "round";ctx.moveTo(lastX, lastY);ctx.lineTo(x, y);ctx.closePath();ctx.stroke();}lastX = x; lastY = y;}function clearArea() {// Use the identity matrix while clearing the canvasctx.setTransform(1, 0, 0, 1, 0, 0);ctx.clearRect(0, 0, ctx.canvas.width, ctx.canvas.height);}</script>
</body>
</html>

PaintHub.cs:

using Microsoft.AspNet.SignalR;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;namespace SignalRTest
{public class PaintHub : Hub{static List<User> users;        //用户集合static string subjectName;      //答案static string hostName;         //当前画画者public PaintHub(){#region " 初始化 "if (users == null){users = new List<User>();}if (string.IsNullOrEmpty(subjectName)){subjectName = GetSubjectName();}if (string.IsNullOrEmpty(hostName) && users.Count > 0){hostName = GetHostName();}#endregion}public void GetAnswer(){if (string.IsNullOrEmpty(subjectName)){subjectName = GetSubjectName();}Clients.All.broadcastAnswer(subjectName);}public void GetPeopleName(){var people = users.FirstOrDefault((p) => p.IsHost == true);if (people != null){Clients.All.broadcastHostName(people.Name);}}public void Send(string message){Clients.All.broadcastMessage(message);}public void AddPeople(string uname){var user = users.FirstOrDefault((p) => p.Name == uname);if (user == null){User u = new User();u.Name = uname;u.IsHost = false;users.Add(u);}string data = Newtonsoft.Json.JsonConvert.SerializeObject(users);//int data = users.Count;Clients.All.getAllUser(data);}public void CheckAnswer(string uname, string answer){string data;if (answer == subjectName){data = "uname";User host_new = users.FirstOrDefault((p) => p.Name == uname);if (host_new != null){//上次画画的人下次猜User host_old = users.FirstOrDefault((p) => p.IsHost == true);if (host_old != null){host_old.IsHost = false;}//猜对的人下次画host_new.IsHost = true;//重新获取题目subjectName = GetSubjectName();}}else{data = "";}Clients.All.checkAnswer(data, uname);}private string GetSubjectName(){string[] arrSubject = new string[] { "鸟", "鱼", "飞机", "熊猫", "老虎", "鳄鱼", "马" };int index = new Random().Next(arrSubject.Length);return arrSubject[index];}private string GetHostName(){int index = new Random().Next(users.Count);users[index].IsHost = true;return users[index].Name;}}public class User{//名称public string Name{get; set;}//性别public bool IsHost{get; set;}}
}

转载于:https://www.cnblogs.com/Kelly-Zheng/p/5215397.html

SignalR2.1部署IIS服务器无法推送消息相关推荐

  1. 服务器主动推送消息数据给客户端

    1 引言 这个问题第一次是我在实现一个导师的方案的时候所发现的,一开始我需要实现服务器与客户端的密钥协商和数据传递,服务器需要主动分发(推送)密钥给客户端,因为以前没有做过相关编码,后来只能想到用反向 ...

  2. web应用从服务器主动推送消息到客户端到方式

    总结帖 为什么需要服务端向客户端推送消息? 在某些应用功能中,例如定位,游戏,社交消息的推送等,用户都是被动接受u消息的,为了处理这类问题,需要服务端向客户端推送消息. 引言: 普通情况下,有客户端向 ...

  3. AD域服务器如何推送消息到客户端,通过域控AD GPO策略推送安装SEP客户端配置步骤...

    通过通过域控域控 AD GPO 策略策略推送推送安装安装 SEP 客户端配置步骤客户端配置步骤 ■ 从SEPM导出SEP安装包 ■ 共享SEP安装包使得客户机可以通过网络共享方法访问 ■ 创建安装SE ...

  4. 苹果服务器怎样推送消息,ios消息推送

    之前一篇说了ios推送证书的生成.这是开发推送的基础环境.这次介绍的是怎么去开发. 来几句废话: 苹果的推送相比于安卓的推送,显得更加清晰,简明许多.首先不必考虑那么多厂商配置,其次苹果的送达率要比安 ...

  5. 服务器极光推送消息推送,极光后台服务器推送消息通知

    1:推送工具类 package com.jetf.util; import java.util.Map; import org.slf4j.Logger; import org.slf4j.Logge ...

  6. 服务器 主动 推送 客户端浏览器 消息***

    前言 通常情况下,无论是web浏览器还是移动app,我们与服务器之间的交互都是主动的,客户端向服务器端发出请求,然后服务器端返回数据给客户端,客户端浏览器再将信息呈现,客户端与服务端对应的模式是: 客 ...

  7. html5服务器推送消息的各种解决办法,WEB服务器推送消息的各种解决办法

    前言:在各种BS架构的应用程序中,往往都希望服务端能够主动地向客户端推送各种消息,以达到类似于邮件.消息.待办事项等通知.而BS架构本身存在的问题就是,服务器一直采用的是一问一答的机制.这就意味着如果 ...

  8. Android Cloud to Device Messaging 服务介绍 – 如何使用云计算推送消息到手机(转载)...

    基 于 Android 的手机是面向移动互联网的手机,保持24小时在线才能充分发挥它的全部能量.而 Google 也在不断提供各式各样的网络服务来吸引用户,有的服务是直接面向终端用户,而有的服务是面向 ...

  9. Springboot整合Websocket(推送消息通知)

    在手机上相信都有来自服务器的推送消息,比如一些及时的新闻信息,这篇文章主要就是实现这个功能,只演示一个基本的案例.使用的是websocket技术. 一.什么是websocket WebSocket协议 ...

最新文章

  1. 【C#小知识】C#中一些易混淆概念总结(三)---------结构,GC,静态成员,静态类...
  2. python如何调用文件进行换位加密_数据文件加密算法–换位加密法 | 学步园
  3. 温故知新MySQL--如何在MySQL表中删除重复行
  4. 火狐访问HTTPS网站显示连接不安全的解决方法
  5. JDBC+Servlet+JSP整合开发之30-JDBC、Servlet、JSP的MVC
  6. Springboot 整合微信小程序实现登录与增删改查
  7. HD_1166敌兵布阵
  8. 分子计算机已经问世,纳米计算机指日可待?
  9. idea创建maven web项目需要注意的一些细节
  10. akka 异常处理_使用Akka处理1000万条消息
  11. 游戏计算机软著登记证书,“VR沙盘游戏心理疗法软件”取得计算机软件著作权登记证书...
  12. python 生成嵌套字典
  13. 编译32位_实战经验:在Windows平台编译x264
  14. Springboot 整合Rabbit MQ
  15. Ctfshow菜狗杯------传说之下(雾)
  16. 晶闸管整流桥matlab仿真,matlab仿真模型作业
  17. python 简单的颜色序列生成器
  18. 心理测评数据分析系统(Java毕业设计)
  19. python全栈工程师 pdf_python全栈工程师项目开发实例实战入门教程百度云
  20. 神马笔记 版本2.0.0——新的旅程

热门文章

  1. 笔记本安装ubuntu单系统
  2. LibGdx tmx地图加载步骤
  3. 版本号semver标准
  4. ModelSim中Altera仿真库的添加(转)
  5. 企业微信API使用基本教程(企业微信的api接口)
  6. Matlab GUI界面编程小白学习笔记
  7. 基于JavaSwing开发中国跳棋游戏带论文 课程设计 大作业 毕业设计
  8. 《小明升职记》(七)
  9. 服务器操作系统应急预案,服务器操作系统应急预案
  10. axios英文文档翻译