Можно SignalR использовать с asp.net Вебформы?

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

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

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

3 ответов


вы можете использовать SignalR с webforms. См. ниже пример из учебника здесь

  1. создать новый проект ASP.NET форм таргетинга .Чистая Framework 4.5 или позднее

  2. измените домашнюю страницу на следующую

    <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>
    
  3. изменить значение по умолчанию.аспн.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();
    
    }
    
  4. добавить пакеты SignalR через NuGet. (Попытка поиска "Microsoft ASP.Net SignalR JS" и "Microsoft ASP.Net SignalR JS")

  5. создать класс-концентратор

    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));
        }
    
    }
    
  6. настройки следующий блок сценария в нижней части страницы (ваш 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>
    
  7. добавьте следующее в обработчик событий Application_Start в global.асакс.cs

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

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

Предварительные Вопросы И Ответы: (Версии используемые мной находятся в скобках) . У меня не протестировал это решение на других версиях

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

шаги:

выполните следующие действия, чтобы заставить SignalR работать в проекте WebForms. Целью данного проекта является периодическая трансляция временных меток всем подключенным клиентам (сеансам браузера) с помощью SignalR. Только первая метка времени генерируется кодом на стороне сервера в коде позади файла. Rest происходит от хаб-класса SignalR, который отвечает за создание временных меток на периодические интервалы и bradcast их для всех подключенных сеансов.

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

    2a. Инструменты --> Диспетчер пакетов NuGet -- > Управление пакетами Nuget для решений.

    2b. Тип "Microsoft.сеть САШ.SignalR "в поиске и выборе" Microsoft.сеть САШ.Помощью SignalR" (сервера).

    2c. На правой панели теперь установите флажок рядом с"SignalR_WebForms". Это позволит включить кнопку" Установить". Выберите последнюю версию (2.2.0 на сегодняшний день) и нажмите на кнопку Установить. Появится диалоговое окно "обзор изменений", которое информирует вас обо всех пакетах (всего 10), которые будут установлены. нажимать OK. Затем нажмите "Принять", чтобы принять условия лицензии. Это начнет скачать и установить процесс (очень быстро). После этого откройте пакеты.конфигурационный файл (который находится под корнем папки 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. добавьте webform и назовите его по умолчанию.aspx (щелкните правой кнопкой мыши на Proj Add --> Webform --> type default.aspx --> нажмите ok.

  2. скопируйте и вставьте этот код в значение по умолчанию.файл 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. скопируйте и вставьте приведенный ниже код в файл кода (по умолчанию.аспн.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 --> Add --> Add ASP.Net папка --> выберите App_Code).

  2. добавьте класс концентратора SignalR и назовите его LogHub.cs для этого щелкните правой кнопкой мыши на папке App_Code --> Добавить - > Выбрать Класс .. (в нижней части списка) --> нажмите на Vsual C#, затем Web, затем SignalR --> выберите SignalR HubClass --> введите LogHub.cs как имя файла. нажимать OK.

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

`

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.цезий. (Щелкните правой кнопкой мыши на App_code --> Add --> Класс --> нажмите на Vsual C# , затем Web, затем General --> выберите класс запуска Owin.) Удалите существующий код и скопируйте код вставки ниже в этот файл класса.Спасать.

    `

    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 это открывает окно Блокнота со страницей html. Найдите "logUL", и вы увидите только разметку, которая показывает начальную метку времени. Нет разметки, которая показывает оставшиеся обновления, поскольку они вводятся концентратором SignalR. Это похоже на АЯКС.

`

<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>

`

вот оно !. НТН !!


введите это в консоль диспетчера пакетов : установка пакета Microsoft.сеть САШ.SignalR-Версия 1.1.3