Asp.net mvc 信号机和MVC包
我试图将SignalR与MVC捆绑包一起使用,但在找到如何将/SignalR/hubs脚本包含到捆绑包中时遇到了问题。现在,我必须在jquery.signal和代码之间插入路径。这将导致三个javascript文件请求Asp.net mvc 信号机和MVC包,asp.net-mvc,bundle,signalr,Asp.net Mvc,Bundle,Signalr,我试图将SignalR与MVC捆绑包一起使用,但在找到如何将/SignalR/hubs脚本包含到捆绑包中时遇到了问题。现在,我必须在jquery.signal和代码之间插入路径。这将导致三个javascript文件请求 有没有办法将/signalr/hubs包含到我的mvc包中?默认的/signalr/hubs脚本由运行时在第一次请求时动态生成,然后缓存 您可以使用hubify.exe(有关详细信息,请参阅)自己预生成文件,以便将其添加到MVC捆绑包中。有点晚了,但我的贡献如下: 创建包含以下内
有没有办法将/signalr/hubs包含到我的mvc包中?默认的/signalr/hubs脚本由运行时在第一次请求时动态生成,然后缓存
您可以使用hubify.exe(有关详细信息,请参阅)自己预生成文件,以便将其添加到MVC捆绑包中。有点晚了,但我的贡献如下:
创建包含以下内容的javascript文件:
(function ($) {
$.ajax({
url: "/signalr/hubs",
dataType: "script",
async: false
});
}(jQuery));
然后将文件添加到bundles集合。这将为您加载“/signalr/hubs”代码。我知道这是一个旧线程,但我想为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");
从中,使用signar.Utils NuGet包,我发现我需要位于包含中心的DLL的目录中:
(假设您有一个标准的解决方案结构,并且正在使用Signal.Utils的2.2.0)
运行该工具后,在运行该工具的目录中会有一个server.js
文件(在本例中为Debug
)
(注意:当使用/p标志指定路径时,我无法让它工作,并且由于某些原因,即使它工作,它也会创建一个包含signalr.exe文件的临时目录)我使用了这个线程中提到的@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/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', '');
};
});
(function ($) {
$.ajax({
url: "/signalr/hubs",
dataType: "script",
async: false
});
}(jQuery));
/* Source https://stackoverflow.com/questions/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>
}
在上面的部分视图中。没有上面的@KTW文件(对/signalr/hubs的ajax请求)
始终为空。这在大多数情况下都很有效。除非站点托管在虚拟目录中。集线器js生成这个
$.hubConnection(“/signalr”…
如果站点位于虚拟目录中,则此操作将不起作用。转到上面的链接,生成hubify.exe的链接位于其中,但此操作不起作用。虽然没有很好的文档记录,但您现在可以使用Microsoft.AspNet.signal.Utils执行此操作。快速步骤:*使用nuget安装Microsoft.AspNet.signal.Utils*将类似的内容添加到生成后事件:“$(SolutionDir)packages\Microsoft.AspNet.signar.Utils.2.2\tools\signar“ghp”$(TargetPath)“XCOPY”$(TargetDir)server.js”“$(ProjectDir)Scripts\hubs”/R/Ycache:true如果要从客户端缓存中获益,这似乎适用于IIS Express,但在部署到完整IIS时会出现404错误。@KTW为什么“async:false”?@sports,因为您不希望依赖它的其他东西在加载之前启动。@DarylTeo,就效率而言,这等于在头上放了一个脚本html标记?正如@mathew leger在下面指出的,这似乎适用于IIS Express,但在部署到完整IIS时会出现404错误。
@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")
var usersHub = $.connection.currentUsersHub;