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?
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.
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.
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");
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 )
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.