SignalR et MVC bundle

J'essaie D'utiliser SignalR avec le bundle MVC, mais j'ai du mal à trouver comment inclure le script /signalr/hubs dans le bundle. Pour l'instant, je dois insérer le chemin entre jquery.signalR et mon code. Cela entraînera trois demandes de fichiers javascript.

Est - il possible d'inclure / signalr / hubs dans mon bundle mvc?

23
demandé sur tereško 2012-07-19 11:43:59

5 réponses

Le script /signalr/hubs par défaut est généré dynamiquement par l'exécution de la première requête, puis mis en cache.

Vous pouvez utiliser hubify.exe (voir http://weblogs.asp.net/davidfowler/archive/2012/06/10/signalr-0-5-1-released.aspx pour plus de détails) pour pré-générer le fichier vous-même, de sorte que vous pouvez l'ajouter dans le bundle MVC.

13
répondu Alexander Köplinger 2012-07-19 16:40:23

Un peu en retard, mais voici ma contribution:
Créer un fichier javascript avec le contenu suivant:

(function ($) {
    $.ajax({
        url: "/signalr/hubs",
        dataType: "script",
        async: false
    });
}(jQuery));

Ajoutez ensuite le fichier à la collection bundles.
Cela chargera le code "/ signalr / hubs " pour vous.

42
répondu KTW 2012-11-07 14:29:19

Je sais que c'est un vieux fil mais je voudrais ajouter ce qui suit pour SignalR 2.X. je voulais vraiment regrouper le proxy en utilisant SquishIt et par essais et erreurs, j'ai réussi à trouver ce qui suit:

using Microsoft.AspNet.SignalR
using Microsoft.AspNet.SignalR.Hubs

var resolver = new DefaultHubManager(new DefaultDependencyResolver());
var proxy = new DefaultJavaScriptProxyGenerator(resolver, new NullJavaScriptMinifier());
string iCanHazScriptNao = proxy.GenerateProxy("/signalr");
2
répondu Michael Viktor Starberg 2014-08-12 06:29:03

De asp.net , en utilisant le SignalR.Utils NuGet package, j'ai trouvé que je devais être dans le répertoire avec la DLL qui a le hub dedans:

(en supposant que vous avez une structure de solution standard et utilisez 2.2.0 de SignalR.Utils )

cd C:\YourSolution\YourProjectWithTheHub\bin\Debug
..\..\..\packages\Microsoft.AspNet.SignalR.Utils.2.2.0\tools\signalr.exe ghp

Après avoir exécuté l'outil, il y aura un fichier server.js dans le répertoire à partir duquel vous l'avez exécuté (dans ce cas, Debug).

(Note: je n'ai pas pu le faire fonctionner en spécifiant le chemin avec l'indicateur /p, et pour une raison quelconque même quand il fonctionne, il crée un répertoire temporaire avec le signalr.fichier exe dedans )

0
répondu John Bubriski 2015-05-13 19:36:50

J'ai utilisé la réponse @ KTW mentionnée sur ce fil et voici le changement complet

BundleConfig

public class BundleConfig
{
    public static void RegisterBundles(BundleCollection bundles)
    {
        bundles.Add(new ScriptBundle("~/bundles/jquery").Include(
            "~/Scripts/modernizr-2.6.2.js",
            "~/Scripts/jquery-2.2.3.js",
            "~/Scripts/jquery-ui-1.11.4.js",
            "~/Scripts/jquery.multiselect.js",
            "~/Scripts/jquery.dataTables.js",
            "~/Scripts/jquery.jstepper.min.js",
            "~/Scripts/underscore.min.js"
        ));

        bundles.Add(new ScriptBundle("~/bundles/SignalRScripts").Include(
            "~/Scripts/jquery.signalR-2.2.2.min.js",
            "~/Scripts/signalRBundle.js",
            "~/Scripts/Views/Search/SignalRFunctions.js"));
    }
}

SignalRFunctions.js

    $(function() {
    // Declare a proxy to reference the hub.
    var usersHub = $.connection.currentUsersHub;
    //Create a function that the hub can call to broadcast messages.
    usersHub.client.broadcastMessage = function(reservationNumber, usrName) {
        //Message broadcast from server
        //now find the id with reservationNumber on the page and to that append the user name
        var id = '#' + reservationNumber;
        if ($(id).length) {
            if (usrName.length) {
                itemsOpened($(id), usrName);
            } else {
                itemsClosed($(id));
            }
        } 
        //else {
        //    //is it possible that server broad casted for a reservationNumber and is not available at the client?
        //}
    };

    //Accepts dictionary from hub and goes through search results
    //https://stackoverflow.com/questions/7776337/reading-c-sharp-dictionary-in-javascript
    usersHub.client.broadcastCollection = function (reservationNumberAndUsers) {
       for (var resNumKey in reservationNumberAndUsers) {
            if (reservationNumberAndUsers.hasOwnProperty(resNumKey)) {
                //Message broadcast from server
                //now find the id with ReservationNumber on the page and to that append the user name
                var id = '#' + resNumKey;
                if ($(id).length) {
                    if (reservationNumberAndUsers[resNumKey].length) {
                        itemsOpened($(id), reservationNumberAndUsers[resNumKey]);
                    } else {
                        itemsClosed($(id));
                    }
                }
            }
        }
    };

    $.connection.hub.start().done(function() {
                var searchedReservationNumbers = [];
                if (typeof jsData !== 'undefined') {
                    if (jsData && jsData.length) {
                        for (var i = 0; i < jsData.length; i++) {
                            searchedReservationNumbers.push(jsData[i].UReservationNumber);
                        }
                        if (searcheduReservationNumbers.length !== 0) {
                            usersHub.server.getWorkingUsersOnUReservationNumber(searcheduReservationNumbers);
                        }
                    }
                }
            }).fail(function () { console.log('Could not Connect To SignalrHub!'); });
        /*In case we would decide to continuously reconnect making connection to server.
        $.connection.hub.disconnected(function() {
            setTimeout(function() {
                    $.connection.hub.start();
                },
                5000); // Restart connection after 5 seconds.
        });*/

function itemsOpened(elem, id) {
    var item = "Opened By - " + id;
    elem.prop('title', item);
    elem.css('background-color', 'chocolate');
};

function itemsClosed(elem) {
    elem.prop('title', "");
    elem.css('background-color', '');
};
});

SignalRBundle.js

(function ($) {
$.ajax({
    url: "/signalr/hubs",
    dataType: "script",
    async: false
});
}(jQuery));
/* Source https://stackoverflow.com/questions/11556110/signalr-and-mvc-bundle */

Une vue partielle.cshtml Au lieu d'écrire ci-dessous dans la vue partielle ci-dessus

@using Localization
@using Newtonsoft.Json
@model NameSpace.ViewModels.FilterVM

@{
    ViewBag.Title = Strings.Filter;
}

@using (Html.BeginForm())
{
    <div class="large-12 columns">
        ---SOME CODE HERE 
    </div>

}

@section scripts
{
<script type="text/javascript" language="javascript">
    var jsData = @Html.Raw(JsonConvert.SerializeObject(Model));
</script>
<script src="~/Scripts/jquery.signalR-2.2.2.min.js"></script>
<script src="~/signalr/hubs"></script>
<script src="~/Scripts/Views/Search/SignalRFunctions.js"></script>
}

Cela a changé en

 @using Localization
    @using Newtonsoft.Json
    @model NameSpace.ViewModels.FilterVM

    @{
        ViewBag.Title = Strings.Filter;
    }

    @using (Html.BeginForm())
    {
        <div class="large-12 columns">
            ---SOME CODE HERE 
        </div>

    }

    @section scripts
    {
    <script type="text/javascript" language="javascript">
        var jsData = @Html.Raw(JsonConvert.SerializeObject(Model));
    </script>
    @Scripts.Render("~/bundles/SignalRScripts")
    }

Avis

@Scripts.Render("~/bundles/SignalRScripts") 

Vue partielle ci-dessus.Sans fichier @ KTW ci-dessus (requête ajax vers /signalr/hubs)

var usersHub = $.connection.currentUsersHub;

Était toujours null.

0
répondu Sandeep 2017-11-29 20:33:54