Может ли SignalR использоваться с asp.net WebForms?

Я хочу использовать SignalR в моем проекте для обновления в реальном времени.

Мой проект разработан в WebForms.

Я искал 3,4 дня, но все, что я нашел, было MVC-примерами. Может ли кто-нибудь предложить решение?

Ответ 1

Вы можете использовать SignalR с веб-формами. Ниже приведен пример из учебника здесь

  • Создайте новый проект ASP.NET WebForms, предназначенный для .NET Framework 4.5 или более поздней версии

  • Измените домашнюю страницу, чтобы она содержала следующие

    <asp:content runat="server" id="BodyContent" contentplaceholderid="MainContent">
    
    
        <h3>Log Items</h3>
        <asp:listview id="logListView" runat="server" itemplaceholderid="itemPlaceHolder" clientidmode="Static" enableviewstate="false">
            <layouttemplate>
                <ul id="logUl">
                    <li runat="server" id="itemPlaceHolder"></li>
                </ul>
            </layouttemplate>
            <itemtemplate>
                <li><span class="logItem"><%#Container.DataItem.ToString() %></span></li>
            </itemtemplate>
        </asp:listview>
    
    </asp:content>
    
  • Измените файл default.aspx.cs codebehind, чтобы включить следующее событие

    protected void Page_Load(object sender, EventArgs e)
    {
    
        var myLog = new List<string>();
        myLog.Add(string.Format("{0} - Logging Started", DateTime.UtcNow));
    
        logListView.DataSource = myLog;
        logListView.DataBind();
    
    }
    
  • Добавить пакеты SignalR через NuGet. (Попытка поиска "Microsoft ASP.Net SignalR JS" и "Microsoft ASP.Net SignalR JS" )

  • Создайте класс концентратора

    public class LogHub : Hub
    {
    
        public static readonly System.Timers.Timer _Timer = new System.Timers.Timer();
    
        static LogHub()
        {
            _Timer.Interval = 2000;
            _Timer.Elapsed += TimerElapsed;
            _Timer.Start();
        }
    
        static void TimerElapsed(object sender, System.Timers.ElapsedEventArgs e)
        {
            var hub = GlobalHost.ConnectionManager.GetHubContext("LogHub");
            hub.Clients.All.logMessage(string.Format("{0} - Still running", DateTime.UtcNow));
        }
    
    }
    
  • Установите следующий блок script внизу вашей страницы (версия jquery и jquery.signalr может отличаться)

    <script src="Scripts/jquery.1.7.1.min.js"></script>
    <script src="Scripts/jquery.signalR-1.0.0-rc1.min.js"></script>
    <script src="http://www.codeproject.com/signalr/hubs" type="text/javascript"></script>
    <script type="text/javascript">
    
        $(function() {
    
            var logger = $.connection.logHub;
    
            logger.client.logMessage = function(msg) {
    
                $("#logUl").append("<li>" + msg + "</li>");
    
            };
    
            $.connection.hub.start();
    
        });
    
    </script>
    
  • Добавьте в обработчик события Application_Start следующее: global.asax.cs

    void Application_Start(object sender, EventArgs e)
    {
        RouteTable.Routes.MapHubs();
    }
    

Ответ 2

Ответ, предоставленный @Stephen, теперь устарел, поскольку он не применяется к последней версии SignalR (v2.2.0). Также есть несколько других вещей, которые не упоминаются, которые IMHO могли бы помочь будущим читателям быстро начинать работу с SignalR с использованием старой старой структуры Webforms. Решение может показаться утомительным, но это не так. Я надеюсь, что это поможет людям, которые посещают эту страницу, искать помощь в SignalR для Webforms.

Pre-Reqs: (Версии, используемые мной, находятся в скобках). У меня НЕ проверено это решение на других версиях

  • MS Visual Studio 2015/2013. (2015) В Win-7 x64
  • .Net FrameWork версии 4.5 или выше (4.5.2)
  • Версия SignalR 2.2.0 от NuGet (Дата выпуска 01/13/2015)
  • jQuery ver 1.6.4
  • Owin v1.0.0 и некоторые другие, такие как Json, owin.Security и т.д. (см. package.config)
  • IIS v7.0 и выше. Работает на IIS Express версии 10.0, которая поставляется с VS2015.

Действия

Выполните следующие шаги, чтобы заставить SignalR работать в проекте WebForms. Целью этого проекта является периодическая передача временных меток всем подключенным клиентам (сеансам браузера) с использованием SignalR. Только первая временная метка генерируется кодом Server Side в коде за файлом. Отдых происходит от SignalR HubClass, который отвечает за генерацию временных меток с периодическими интервалами и разбивает их на ВСЕ подключенные сеансы.

  • В Visual Studio (2015) Создайте пустой проект WebForms (выберите пустой шаблон и проверьте WebForms в разделе "Добавить основные библиотеки и папки" ). Предположим, мы назовем его "SignalR_WebForms".
  • Чтобы загрузить, установить и добавить ссылки на библиотеки SignalR + jQuery + Owin

    2а. Инструменты → NuGet Package Manager → Управление пакетами Nuget для решений.

    2b. Введите "Microsoft.ASPNet.SignalR" в Search и выберите "Microsoft.ASPNet.SignalR" (серверный компонент).

    2в. На правой панели установите флажок рядом с "SignalR_WebForms". Это позволит включить кнопку "Установить". Выберите последнюю версию (2.2.0 на сегодня) и нажмите кнопку "Установить". Появится диалоговое окно "Обзор изменений", которое сообщит вам обо всех пакетах (всего 10), которые будут установлены. Нажмите "ОК". Затем нажмите "Принять", чтобы принять условия лицензии. Это запустит процесс загрузки и установки (очень быстро). После этого откройте файл Packages.config(который находится под корнем папки proj), и он должен выглядеть следующим образом:

`

<-- Packages.config should look like this  -->

<?xml version="1.0" encoding="utf-8"?>
    <packages>
      <package id="jQuery" version="1.6.4" targetFramework="net452" />
      <package id="Microsoft.AspNet.SignalR" version="2.2.0" targetFramework="net452" />
      <package id="Microsoft.AspNet.SignalR.Core" version="2.2.0" targetFramework="net452" />
      <package id="Microsoft.AspNet.SignalR.JS" version="2.2.0" targetFramework="net452" />
      <package id="Microsoft.AspNet.SignalR.SystemWeb" version="2.2.0" targetFramework="net452" />
      <package id="Microsoft.CodeDom.Providers.DotNetCompilerPlatform" version="1.0.0" targetFramework="net452" />
      <package id="Microsoft.Net.Compilers" version="1.0.0" targetFramework="net452" developmentDependency="true" />
      <package id="Microsoft.Owin" version="2.1.0" targetFramework="net452" />
      <package id="Microsoft.Owin.Host.SystemWeb" version="2.1.0" targetFramework="net452" />
      <package id="Microsoft.Owin.Security" version="2.1.0" targetFramework="net452" />
      <package id="Newtonsoft.Json" version="6.0.4" targetFramework="net452" />
      <package id="Owin" version="1.0" targetFramework="net452" />
</packages>

`

  1. Добавьте веб-форму и назовите ее как default.aspx(RightClick on Proj Add → Webform → type default.aspx → нажмите ok.

  2. Скопируйте этот код в файл default.aspx(разметка)

`

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="default.aspx.cs" Inherits="SignalR_WebForms._default" %>

<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title>SignalR Using webForms</title>

    <script src="Scripts/jquery-1.6.4.js"></script>
    <script src="Scripts/jquery.signalR-2.2.0.js"></script>
    <script src="signalr/hubs"></script>


    <script type="text/javascript">

        $(function() {

            var logger = $.connection.logHub;

            logger.client.logMessage = function(msg) {

                $("#logUl").append("<li>" + msg + "</li>");

            };

            $.connection.hub.start();

        });

    </script>

</head>
<body>
    <form id="form1" runat="server">
    <div>

    <h3>Log Items</h3>
    <asp:listview id="logListView" runat="server" itemplaceholderid="itemPlaceHolder" clientidmode="Static" enableviewstate="false">
        <layouttemplate>
            <ul id="logUl">
                <li runat="server" id="itemPlaceHolder"></li>
            </ul>
        </layouttemplate>
        <itemtemplate>
                <li><span class="logItem"><%#Container.DataItem.ToString() %></span></li>
        </itemtemplate>
    </asp:listview>



    </div>



    </form>
</body>
</html>

`

  1. Скопируйте код ниже в код файл (default.aspx.cs)

`

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace SignalR_WebForms
{
    public partial class _default : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            var myLog = new List<string>();
            myLog.Add(string.Format("{0} - Logging Started", DateTime.UtcNow));

            logListView.DataSource = myLog;
            logListView.DataBind();
        }
    }
}

`
  1. Добавьте в проект папку App_Code. (Щелкните правой кнопкой мыши по Proj → Добавить → Добавить папку ASP.Net → Выберите App_Code).

  2. Добавьте класс SignalR Hub и назовите его как LogHub.cs Для этого щелкните правой кнопкой мыши по папке App_Code → Добавить → Выбрать класс.. (внизу списка) → Нажмите Vsual С#, затем Web, затем SignalR → Pick SignalR HubClass → тип LogHub.cs как имя файла. Нажмите "ОК".

  3. Откройте файл класса LogHub.cs и удалите существующий код и скопируйте его в него. Сохранить.

`

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using Microsoft.AspNet.SignalR;

namespace SignalR_WebForms.App_Code
{
    public class LogHub : Hub
    {
        public static readonly System.Timers.Timer _Timer = new System.Timers.Timer();

        static LogHub()
        {
            _Timer.Interval = 5000;
            _Timer.Elapsed += TimerElapsed;
            _Timer.Start();
        }

        static void TimerElapsed(object sender, System.Timers.ElapsedEventArgs e)
        {
            var hub = GlobalHost.ConnectionManager.GetHubContext("LogHub");
            hub.Clients.All.logMessage(string.Format("{0} - Still running", DateTime.UtcNow));
        }
    }
}

`

  1. Добавьте файл класса запуска Owin и назовите его как Startup1.cs. (Щелкните правой кнопкой мыши на App_code → Добавить → Класс → Нажмите Vsual С#, затем Web, затем General → Pick Owin Startup class.) Удалите существующий код и скопируйте код ниже в этот файл класса. Сохраните.

    `

    using System;
    using System.Threading.Tasks;
    using Microsoft.Owin;
    using Owin;
    
    [assembly: OwinStartup(typeof(WebApplication1.App_Code.Startup1))]
    
    namespace WebApplication1.App_Code
    {
        public class Startup1
        {
            public void Configuration(IAppBuilder app)
            {
                app.MapSignalR();
            }
        }
    }
    

`

  1. Создайте и запустите Proj (F5). Если ошибок нет, вы должны увидеть следующий вывод в локальном браузере.

`

Log Items
•06/04/2016 09:50:02 PM - Logging Started
•06/04/2016 09:50:06 PM - Still running
•06/04/2016 09:50:11 PM - Still running
•06/04/2016 09:50:16 PM - Still running
•06/04/2016 09:50:21 PM - Still running
.....
.....
.....
.....
Keeps Going **without** having to refresh the Browser.

`

  1. От удаленного компьютера доступа к одному сайту, и вы должны получить точные отметки времени. Это проверяет, работает ли сайт так, как ожидалось.

  2. Для дальнейшей проверки Щелкните правой кнопкой мыши на браузере и выберите "Просмотр источника". На I.E открывается окно Notepad со страницей html. Найдите "logUL", и вы увидите только разметку, показывающую начальную временную метку. Нет разметки, которая показывает оставшиеся обновления, поскольку они вводятся концентратором SignalR. Это похоже на AJAX.

`

<div>
<h3>Log Items</h3>
        <ul id="logUl">

            <li><span class="logItem">06/04/2016 09:50:02 PM - Logging Started</span></li>

        </ul>

</div>

`

Вот оно! HTH!!

Ответ 3

введите это в консоли диспетчера пакетов: install-package Microsoft.AspNet.SignalR -Version 1.1.3