asp.net-mvc - net - bundling and minification in mvc 5 example
SignalR y MVC bundle (5)
Desde asp.net , utilizando el paquete SignalR.Utils NuGet, descubrí que necesitaba estar en el directorio con la DLL que tiene el concentrador:
( asumiendo que tiene una estructura de solución estándar y está utilizando 2.2.0 de SignalR.Utils )
cd C:/YourSolution/YourProjectWithTheHub/bin/Debug
../../../packages/Microsoft.AspNet.SignalR.Utils.2.2.0/tools/signalr.exe ghp
Después de ejecutar la herramienta, habrá un archivo server.js
en el directorio donde la ejecutó (en este caso, Debug
).
( Nota: no pude hacer que funcionara al especificar la ruta con el indicador / p, y por alguna razón, incluso cuando funciona, crea un directorio temporal con el archivo signalr.exe )
Estoy tratando de usar SignalR con el paquete MVC, pero tengo problemas para descubrir cómo incluir el script / signalr / hubs en el paquete. Por ahora tengo que insertar la ruta entre jquery.signalR y mi código. Eso dará lugar a tres solicitudes de archivos javascript.
¿Hay alguna forma de incluir / signalr / hubs en mi paquete de mvc?
El script predeterminado / signalr / hubs es generado dinámicamente por el tiempo de ejecución en la primera solicitud y luego se almacena en caché.
Puede usar hubify.exe (consulte http://weblogs.asp.net/davidfowler/archive/2012/06/10/signalr-0-5-1-released.aspx para obtener detalles) para generar el archivo previamente. para que puedas agregarlo al paquete MVC.
Sé que este es un tema antiguo, pero me gustaría agregar lo siguiente para SignalR 2.x. Tenía muchas ganas de agrupar el proxy con SquishIt y, por prueba y error, logré encontrar lo siguiente:
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");
Un poco tarde, pero aquí está mi contribución:
Crea un archivo javascript con los siguientes contenidos:
(function ($) {
$.ajax({
url: "/signalr/hubs",
dataType: "script",
async: false
});
}(jQuery));
A continuación, agregue el archivo a la colección de paquetes.
Esto cargará el código "/ signalr / hubs" por ti.
Usé la respuesta @KTW mencionada en este hilo y aquí está el cambio completo
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://.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://.com/questions/11556110/signalr-and-mvc-bundle */
SomePartialView.cshtml En lugar de escribir abajo en la vista parcial de arriba
@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>
}
Esto cambió a
@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")
}
darse cuenta
@Scripts.Render("~/bundles/SignalRScripts")
en vista parcial arriba. Sin el archivo @KTW arriba (solicitud ajax para / signalr / hubs)
var usersHub = $.connection.currentUsersHub;
Siempre venia como nulo.