Комплект SignalR и MVC
Я пытаюсь использовать SignalR с пакетом MVC, но имею проблемы с поиском, как включить /signalr/hubs script в пакет. На данный момент я должен вставить путь между jquery.signalR и моим кодом. Это приведет к трем запросам файла javascript.
Есть ли способ включить /signalr/hubs в мой пакет mvc?
Ответы
Ответ 1
Значение по умолчанию /signalr/hubs script генерируется динамически по времени выполнения по первому запросу и затем кэшируется.
Вы можете использовать hubify.exe(см. http://weblogs.asp.net/davidfowler/archive/2012/06/10/signalr-0-5-1-released.aspx для получения дополнительной информации), чтобы предварительно создать файл самостоятельно, чтобы вы могли добавить его в пакет MVC.
Ответ 2
Немного поздно, но вот мой вклад:
Создайте файл javascript со следующим содержимым:
(function ($) {
$.ajax({
url: "/signalr/hubs",
dataType: "script",
async: false
});
}(jQuery));
Затем добавьте файл в коллекцию пакетов.
Это загрузит код "/signalr/hubs" для вас.
Ответ 3
Я знаю, что это старый поток, но я хотел бы добавить следующее для SignalR 2.x. Я действительно хотел связать прокси-сервер с помощью SquishIt, и по пробной версии и ошибке мне удалось найти следующее:
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");
Ответ 4
Из asp.net, используя пакет SignalR.Utils NuGet, я обнаружил, что мне нужно быть в каталоге с DLL, который имеет концентратор в нем:
(предполагая, что у вас стандартная структура решения и используете 2.2.0 SignalR.Utils)
cd C:\YourSolution\YourProjectWithTheHub\bin\Debug
..\..\..\packages\Microsoft.AspNet.SignalR.Utils.2.2.0\tools\signalr.exe ghp
После запуска инструмента в каталоге, в котором вы его запускали, будет server.js
файл. (Debug
).
(Примечание. Я не мог заставить его работать при указании пути с флагом /p, и по какой-то причине, даже когда он работает, он создает каталог temp с файлом signalr.exe в нем)
Ответ 5
Я использовал ответ @KTW, упомянутый в этом потоке, и вот полное изменение
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/info/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/info/11556110/signalr-and-mvc-bundle */
SomePartialView.cshtml
Вместо того, чтобы писать ниже в частичном представлении
@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>
}
Это изменилось на
@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")
}
Примечание
@Scripts.Render("~/bundles/SignalRScripts")
в частичном представлении выше. Без файла @KTW выше (ajax-запрос/signalr/hubs)
var usersHub = $.connection.currentUsersHub;
всегда приходил как null.