2012-06-24 37 views
18

Tôi đang sử dụng Visual Studio 2012 Ultimate RC, SignalR 0.5.1 và Jquery 1.7.2 trong một ứng dụng MVC4.

tôi đã xem xét: MVC4 SignalR "signalr/hubs" 501 Not Implemented Error

Nhưng nó không ảnh hưởng đến vấn đề của tôi (Tôi đang sử dụng IIS Express để debug).

Khi tôi cố gắng sử dụng SignalR, biến $ .connection không được xác định. mã phía máy chủ của tôi:

[HubName("tenantHub")] 
public class TenantHub : Hub 
{ 
    ... 
    void TenantChange(CrudAction action, Tenant tenant) 
    { 
     Clients.eventOccurred(action.ToString(), tenant); 
    } 
} 

Khách hàng bên:

$(function() { var test = $.connection.tenantHub; }); 

Khách hàng bên SignalR/hubs đang được tham chiếu và tôi có thể thấy đoạn mã JS, nó không ném bất kỳ lỗi nào. Nhưng tham chiếu $ .connection ném một Uncaught TypeError: Cannot read property 'tenantHub' of undefined. Cũng cố gắng làm ví dụ trò chuyện mặc định, nó cho cùng một lỗi. SignalR không được hỗ trợ khi sử dụng trong VS2012 hay tôi chỉ là ngu ngốc?

+0

Did bạn cố gắng để gỡ lỗi trên máy chủ? Có ngoại lệ nào không? Bạn đã bắt đầu kết nối chưa? '$ .connection.hub.start();' Đó là tất cả những gì tôi có thể nghĩ ngay bây giờ: ( –

+0

Có, tôi đã thử điều này, nhưng biến 'kết nối' chính nó là không xác định. – Bas

+0

Tôi nghĩ rằng vấn đề xuất phát từ vị trí của Tệp .js, bạn đã nhập 'jquery.signalR-0.5.1.min.js' và' signalr/hubs' chưa? Có lẽ bạn nên cố gắng gỡ lỗi bằng cách sử dụng 'firebug' –

Trả lời

9

Thử dùng [HubName("tenantHub")] khỏi lớp học của bạn. Tôi sẽ không làm việc nếu tôi có những người ở đó. Ngoài ra, hãy thử đặt các hub của bạn vào một thư mục có tên là "Hubs" tại thư mục gốc của dự án của bạn.

25

Thử xóa BundleConfig.RegisterBundles(BundleTable.Bundles); từ Global.asax.cs và xem điều đó có hữu ích không?

+12

Điều này đã giải thích được lý do tại sao, theo mặc định, mẫu MVC4 bao gồm jQuery ngay ở cuối tệp bố cục của bạn (bất ngờ và có vẻ ngu ngốc khi xem xét nó Vì vậy, trang của tôi đã bao gồm jquery hai lần mà screwed tất cả mọi thứ lên. Cảm ơn Thiêm :) – Rocklan

+0

Đây chính xác là vấn đề đối với tôi khi tôi sử dụng mẫu MVC 4 mặc định. Cảm ơn bạn!! – cortijon

+0

Trên thực tế, nó giúp, nhưng cách đúng đắn để làm điều đó là bao gồm các tập lệnh bổ sung của bạn trong phần kịch bản '@section scripts {}' NẾU bạn muốn sử dụng bố cục mặc định, HOẶC thay đổi bố cục cho phù hợp với nhu cầu của bạn (tập lệnh tại trên cùng, không có jquery trong bố trí, vv) –

3

Tôi đã gặp vấn đề tương tự trong VS2012 RTM.

Vấn đề là lần đầu tiên tôi thêm signalr vào BundleConfig.cs và dự kiến ​​nó sẽ hoạt động. Nhưng sau đó sử dụng 'Xem nguồn' trong trình duyệt, tôi nhận thấy rằng signalr.js đã được đưa vào trước jquery.js. signalr.js được đưa vào đầu trang, jquery được đưa vào cuối trang.

Sau khi một số fiddling với BundleConfig signalr.js đã được bao gồm sau jquery.js, và bây giờ signalr hoạt động như một sự quyến rũ!

2

Hãy thử đặt RouteTable.Routes.MapHubs(); như mục đầu tiên trên Application_Start() trong Global.asax.cs

Tôi có một sample code/project here

5

này chúng tôi thường gây ra do tải jQuery hai lần. Thông thường chúng ta đang vào thói quen tải jQuery ở chân trang. Kể từ khi signalr phàn nàn và buộc bạn phải bao gồm thư viện jQuery trước signalr-x.js.

Bạn có thể bao gồm jQuery trước signalr-x.js và bạn có thể làm một cái gì đó như thế này ở chân, nơi bạn bao gồm các plugin jQuery để tránh tải nó hai lần:

<script type="text/javascript"> 
    !window.jQuery && document.write('<script src="//ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"><\/script>'); 
    !window.jQuery && document.write('<script src="/public/js/vendor/jquery-1.9.1.min.js"><\/script>'); 
</script> 

Hope this helps. :)

+0

Thật vậy! Big +1 :) (mặc dù lỗi lầm của tân binh từ tôi ..) – army

0

Tôi đã có một vấn đề tương tự, tôi đã làm việc mẫu hình ảnh studio 2010 gỡ lỗi nhưng không phải trên localhost (IIS7.5 windows 7). Tôi thấy rằng tôi đã có một dấu gạch chéo thêm trong định nghĩa cho "signalr/hubs", tôi đã sử dụng "/ signalr/hubs". Tôi cũng đã thêm tham chiếu JSON 2 js cho khả năng tương thích của trình duyệt. Lưu ý thứ tự khai báo .js là quan trọng.

<script src="Scripts/JSON2.js" type="text/javascript"></script> 
<script src="http://code.jquery.com/jquery-1.8.2.min.js" type="text/javascript"></script> 
<script src="Scripts/jquery.signalR-1.1.2.min.js" type="text/javascript"></script> 
<script src="signalr/hubs" type="text/javascript"></script> 
<script type="text/javascript"> 

Để tìm vấn đề này, tôi bật ghi nhật ký như sau và xem trong bảng điều khiển của công cụ dev để xem lỗi khi được triển khai trên máy chủ cục bộ.

// Logs errors to the browser dev 'f12' console 
$.connection.hub.logging = true; 

Hy vọng điều này sẽ giúp người khác. Tôi đang chơi với chrome, IE9, 10 trên nhiều PC bây giờ - một thư viện tuyệt vời!

0

Đảm bảo bạn không có tên trung tâm trùng lặp; [HubName ("tenantHub")] - đó là hai hoặc nhiều lớp trung tâm được trang trí với cùng tên.

1

Nếu không có cách nào phù hợp với bạn, hãy đảm bảo rằng trong nguồn html cuối cùng của bạn không chỉ tham chiếu đến tập lệnh SignalR xuất hiện sau jQuery mà còn phiên bản khớp với tệp thực tế bạn có trong thư mục tập lệnh.

<script src="~/Scripts/jquery.signalR-2.0.2.js"></script> 

Ví dụ một này phù hợp với 2.0.2 phiên bản của SignalR, nếu bạn nâng cấp SignalR qua gói sau đó bạn sẽ phải tự chỉnh sửa dòng này.

0

Ở chiều ngược lại với John,

tôi đã có thêm một/đến việc khai signalr/hub

tức.

<script src="signalr/hubs" type="text/javascript"></script> 

Trở thành

<script src="/signalr/hubs" type="text/javascript"></script>