有關於MVC SignalR的問題

来源:http://www.cnblogs.com/herbertchina/archive/2016/04/04/5351326.html
-Advertisement-
Play Games

剛拜讀 @Learning hard 的 [Asp.net 開發系列之SignalR篇]專題一:Asp.net SignalR快速入門 跟著博文一步步操作,這是新人的學習方式 然而筆者的開發環境和 @Learning hard 的有所不同,導致出現了一些小的問題! 筆者環境 VS2013 + .ne ...


剛拜讀 @Learning hard[Asp.net 開發系列之SignalR篇]專題一:Asp.net SignalR快速入門

跟著博文一步步操作,這是新人的學習方式

然而筆者的開發環境和 @Learning hard 的有所不同,導致出現了一些小的問題!

首先,新建了一個MVC環境

筆者環境 VS2013 + .net 4.5 + MVC 4.0

新建項目選擇的是 Internet 應用程式,為了支持 SignalR,使用 NuGet 控制台往項目中安裝了 SignalR (這些都是系統預設,並沒有更改所謂的身份驗證,其實我也並不知道@Learning hard 及網路上所說的身份認證是什麼)

Install-Package Microsoft.AspNet.SignalR
然後,就是需要添加的主體

新建繼承 Hub 類的 【SignalR集線器(v2)】類文件,創建一個業務邏輯需要的方法,本例中主要應用到的方法:

// 調用所有客戶端的sendMessage方法
Clients.All.sendMessage(name, message);
最後,頁面中實例化 SignalR 類,做具體業務邏輯

代碼可以參考原文中給出的部分 【原文】

@section scripts
{
    <!--引用SignalR庫. -->
    <script src="~/Scripts/jquery.signalR-2.2.0.min.js"></script>
     <!--引用自動生成的SignalR 集線器(Hub)腳本.在運行的時候在瀏覽器的Source下可看到 -->
    <script src="~/signalr/hubs"></script>
    
    <script>
        $(function () {
            // 引用自動生成的集線器代理
            var chat = $.connection.serverHub;
            // 定義伺服器端調用的客戶端sendMessage來顯示新消息
           
            chat.client.sendMessage = function (name, message) {
                // 向頁面添加消息
                $('#discussion').append('<li><strong>' + htmlEncode(name)
                    + '</strong>: ' + htmlEncode(message) + '</li>');
            };
           
            // 設置焦點到輸入框
            $('#message').focus();
            // 開始連接伺服器
            $.connection.hub.start().done(function () {
                $('#sendmessage').click(function () {
                    // 調用伺服器端集線器的Send方法
                    chat.server.send($('#message').val());
                    // 清空輸入框信息並獲取焦點
                    $('#message').val('').focus();
                });
            });
        });
        
        // 為顯示的消息進行Html編碼
        function htmlEncode(value) {
            var encodedValue = $('<div />').text(value).html();
            return encodedValue;
        }
    </script>
}
其他

控制器和視圖的添加部分就不說了,看看 MVC 入門基本上就會了。

問題來了!
The following errors occurred while attempting to load the app.
- No assembly found containing an OwinStartupAttribute.
- No assembly found containing a Startup or [AssemblyName].Startup class.
To disable OWIN startup discovery, add the appSetting owin:AutomaticAppStartup with a value of "false" in your web.config.
To specify the OWIN startup Assembly, Class, or Method, add the appSetting owin:AppStartup with the fully qualified startup class or configuration method name in your web.config.

運行之後,應該不少朋友有這樣的報錯(可能是中文的錯誤提示)!

看著錯誤提示,其實直接就知道大概什麼情況了,OwinStartupAttribute 沒有找到!

緊跟著提示了兩種做法,也就是這兩種做法誤導了初學者!

我們按照提示,於是在網上搜索得到的做法是:

<appSettings>

    <add key="owin:AutomaticAppStartup" value="false" />
</appSettings>

嘿嘿,你還真別看,居然就真的不報錯了,但是下麵的問題更大了,因為世界的業務邏輯不行啊,怎麼回事,調試發現,瀏覽到業務所在頁面,報錯:

GET http://localhost:10292/signalr/hubs 404 (Not Found)
Uncaught TypeError: Cannot read property 'client' of undefined

 

 

嘿嘿,這個又是什麼……到網上搜了很多,最後搜到: https://github.com/SignalR/SignalR/issues/2649

最後的 @Xiaohongt 回覆中給出了正確方法,同時也是官方使用 SignalR 步驟:

http://www.asp.net/signalr/overview/getting-started/tutorial-getting-started-with-signalr

其中有一步驟:

6. In Solution Explorer, right-click the project, then click Add | OWIN Startup Class. Name the new class Startup and click OK.

Note: If you are using Visual Studio 2012, the OWIN Startup Class template will not be available. You can add a plain Class called Startup instead.

然後給出了代碼(註意紅色):

using Microsoft.Owin;
using Owin;
[assembly: OwinStartup(typeof(SignalRChat.Startup))]
namespace SignalRChat
{
    public class Startup
    {
        public void Configuration(IAppBuilder app)
        {
            // Any connection or hub wire up and configuration should go here
            app.MapSignalR();
        }
    }
}

果然,當添加完這樣的類之後,問題解決了,業務功能實現了(去掉之前web.config中加入的錯誤代碼)!

結束言

是的是的,問題解決了,然而……什麼情況的,於是乎,就有了下麵的結束語:

Owin:Open Web Interface for .NET

支持 Owin 的Web框架有:

更多參見: http://kb.cnblogs.com/page/509236/

每一個使用的OWin組件的Web框架都需要一個StartUp入口類,用來聲明OWin組件:

1.項目會自動掃描程式集根下的名為StartUp的類作為入口類

2.通過添加 [assembly: OwinStartup(typeof(SignalRChat.Startup))] 標簽標記入口類

3.如果你的啟動類不在當前命名空間下 <add key="owin:AppStartup" value="[NameSpace].Startup" />

4.由於第一點的存在,所以如果有名為StartUp的類,並且不是入口點,需要使用 <add key="owin:AutomaticAppStartup" value="false" />

 

如果有什麼錯誤的地方,請園友指出,以防誤導新人,謝謝!

element

Font
font-family
font-size
font-style
font-variant
font-weight
letter-spacing
line-height
text-decoration
text-align
text-indent
text-transform
white-space
word-spacing
color
Background
bg-attachment
bg-color
bg-image
bg-position
bg-repeat
Box
width
height
border-top
border-right
border-bottom
border-left
margin
padding
max-height
min-height
max-width
min-width
outline-color
outline-style
outline-width
Positioning
position
top
bottom
right
left
float
display
clear
z-index
List
list-style-image
list-style-type
list-style-position
Table
vertical-align
border-collapse
border-spacing
caption-side
empty-cells
table-layout
Effects
text-shadow
-webkit-box-shadow
border-radius
Other
overflow
cursor
visibility

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 原文鏈接:http://www.orlion.ga/776/ 用C寫的程式效率可能不如彙編,而且有些平臺相關的指令必須手寫,例如x86是埠I/O,而c語言就沒有這個概念,所以in/out指令必須用彙編來寫。 gcc提供了一種擴展寫法可以在C代碼中試用內聯彙編,最簡單的格式是__asm__("ass ...
  • 1,在python中#以井號鍵開頭的是註釋的內容,解釋器不會管他; 2,在python中:以冒號結尾時,後面的縮進為其代碼塊,這是約定熟成的習慣,並且堅持一個縮進頂4個空格。(sublime Text設置一個tab頂4個空格:在preference——>seting-user中,在花括弧中添加如下一 ...
  • 基礎知識(包括但不限於:二叉查找樹是啥,SBT又是啥反正又不能吃,平衡樹怎麼旋轉,等等)在這裡就不(lan)予(de)贅(duo)述(xie)了。 由於學生黨比較忙,所以博文寫的比較簡略,有時間會慢慢補完 先貼代碼: 1 int seed; 2 int _rand() 3 { 4 return se ...
  • 2nd
    02.01_Java語言基礎(常量的概述和使用)(掌握) A:什麼是常量 在程式執行的過程中其值不可以發生改變 B:Java中常量的分類 字面值常量 自定義常量(面向對象部分講) C:字面值常量的分類 字元串常量 用雙引號括起來的內容 整數常量 所有整數 小數常量 所有小數 字元常量 用單引號括起來 ...
  • ggg fffffffffffffffffffffffffffffffffffffffffffffff ...
  • 遍歷List的多種方式 在講如何線程安全地遍歷List之前,先看看通常我們遍歷一個List會採用哪些方式。 方式一: 方式二: 方式三: 方式四(Java 8): 方式五(Java 8 Lambda): 首先,方式一的遍歷方法是一種非常不建議使用的方式,特別是對於LinkedList。LinkedL ...
  • 輸出:用print()在括弧中加上字元串,就可以向屏幕上輸出指定的文字。比如輸出'hello, world',用代碼實現如下>>>print('hello,world') 也可以是多個字元串,中間用逗號鏈接‘;代碼實現如下>>>print('The quick bronw fox','jumps o ...
  • 原文鏈接:http://www.orlion.ga/207/ 一、代理模式 代理模式是經常用到的設計模式,代理模式是給指定對象提供代理對象。由代理對象來控制具體對象的引用。 代理模式涉及到的角色: 抽象主題角色:聲明瞭代理主題和真實主題的公共介面,使任何需要真實主題的地方都能用代理主題代替。 代理主 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...