2012-06-12 40 views
9

Ứng dụng web ASP.NET MVC 4 của tôi hiển thị dữ liệu cập nhật thường xuyên cho khách hàng. Dữ liệu có nguồn gốc từ một nguồn bên ngoài (một ứng dụng được cài đặt trên máy chủ) và được xử lý bởi SQL Server 2008 R2.Đẩy dữ liệu từ SQL Server sang ứng dụng web bằng SignalR

Hiện tại, luồng dữ liệu khá truyền thống: các cuộc thăm dò của khách hàng từ ASP.NET, các cuộc thăm dò ý kiến ​​ASP.NET lần lượt từ SQL Server.

Để tránh bỏ phiếu (và bây giờ tôi yêu cầu tương tác thời gian thực giữa người dùng ứng dụng web), tôi đang thay đổi cách tiếp cận để đẩy, sử dụng signalR để phát dữ liệu cho khách hàng. Điều này làm tăng sự êm ái của trải nghiệm người dùng và cũng làm giảm chi phí bỏ phiếu giữa khách hàng và máy chủ ASP.NET.

Vấn đề bây giờ là đảo ngược luồng giữa SSRV và ASP.NET: Tôi muốn đẩy dữ liệu từ SSRV đến ASP.NET theo cách hiệu quả nhất.

SSRV đang chạy các truy vấn tốn kém để nhập một số dữ liệu ngoài - và sau khi dữ liệu được xử lý, chúng cũng sẵn sàng chia sẻ qua Internet thông qua chương trình phát sóng.

Cách tiếp cận người nghèo hiện tại của tôi: đưa ra yêu cầu POST Http tới Ứng dụng web (trên máy chủ cục bộ) để gửi dữ liệu (Tôi đang sử dụng hàm CLR cho điều đó).

Khi dữ liệu được xử lý, tôi gói chúng sẵn sàng cho HttpWebRequest, xếp hàng chúng trong một Nhà môi giới dịch vụ để tránh ảnh hưởng đến các hoạt động khác và tôi đã hoàn tất.

Tôi đã viết tắt SqlDependency như sẽ buộc tôi để truy vấn cho dữ liệu - không phải là một lợi thế lớn (Tôi sẽ đánh đổi một yêu cầu localhost HTTP cho một chạy truy vấn trên SQL Server)

Cùng lúc đó tôi cảm thấy nên có một cách neater để làm điều này.

Mọi đề xuất?

Trả lời

7

Vâng, Tôi đã nhận ra hơi muộn về thư viện SignalR.Client.NET.35.

Tại thời điểm viết bài, nó không phải là đóng gói trong NuGet, vì vậy mã phải downloaded từ trang web của dự án GitHub SignalR và thêm vào như là một dự án với các giải pháp (cả SignalR.Client.NETSignalR. Client.NET35 bắt buộc).

Dưới đây là giải pháp cuối cùng, trong trường hợp nó có thể giúp một người nào đó trong tương lai:

using System; 
using System.Collections; 
using System.Collections.Generic; 
using System.Text; 
using System.Data; 
using System.Xml; 
using Microsoft.SqlServer.Server; 
using System.Data.SqlTypes; 
using System.Net; 
using System.IO; 
using System.Xml.XPath; 
using SignalR.Client.Hubs; 

    internal static HubConnection connectionT = null; 
    internal static IHubProxy msgHubT = null; 

    /// <summary> 
    /// allows SSRV to send a message to the Web Socket hub 
    /// </summary> 
    /// <param name="URL">URL of the Hub</param> 
    /// <param name="hubName">Name of the message Hub to be used for broadcasting.</param> 
    /// <param name="hubMethod">Hub method to be used for broadcasting.</param> 
    /// <param name="message">Message to be broadcasted.</param> 
    [SqlFunction()] 
    public static void ut_sendMsgToHub(string URL, string hubName, string hubMethod, string message) 
    { 
     try 
     { 
     if (connectionT == null) 
     { 
      connectionT = new HubConnection(URL.Trim()); // "http://localhost:56844/M2Hub" 
     } 
     if (msgHubT == null) 
     { 
      msgHubT = connectionT.CreateProxy(hubName.Trim());//"M2data" 
     } 

      if (!(connectionT.State == SignalR.Client.ConnectionState.Connected 
       || connectionT.State == SignalR.Client.ConnectionState.Reconnecting 
       || connectionT.State == SignalR.Client.ConnectionState.Connecting)) 
       connectionT.Start().Wait(); 
      msgHubT.Invoke(hubMethod.Trim(), message.Trim()).Wait();//"Send" 
     } 
     catch (Exception exc) 
     { 
      SqlContext.Pipe.Send("ut_sendMsgToHub error: " + exc.Message + Environment.NewLine); 
     } 
    } 

quan trọng cần chú ý: kèm theo biên soạn SQL SERVER 2008R2 thư viện CLR bạn sẽ phải đặt dlls sau trong cùng thư mục:

  • Newtonsoft.Json
  • SignalR.Client.Net35 rõ ràng
  • SMdiagnostics
  • System.Runtime.Serialization
  • System.ServiceModel trong phiên bản bên phải (đề cập đến phiên bản như đã nêu trong GAC trong C: \ Windows \ lắp ráp trong trường hợp không tương thích).
  • System.Threading

cuối cùng trong SQL SERVER:

CREATE ASSEMBLY CLR_Bridge from 'C:\PathToLibraries\Library_CLR.dll' 
WITH PERMISSION_SET = UNSAFE --UNSAFE required 
CREATE PROCEDURE ut_sendMsgToHub 
@url nchar(125) , 
@hubName nchar(75), 
@hubMethod NCHAR(75), 
@message NVARCHAR(MAX) 
AS 
EXTERNAL NAME CLR_Bridge.[LibraryNamespace.CLR_Bridge].ut_sendMsgToHub 

Để gọi ut_sendMsgToHub tôi sử dụng một nhà môi giới dịch vụ vì vậy mà tôi chắc chắn rằng bất kỳ vấn đề với việc thực hiện các chức năng được tách rời khỏi các thủ tục được lưu trữ xử lý dữ liệu

+1

vui lòng đã giúp tôi với một số nhận xét về cách tiếp cận này đối với POST đơn giản - bạn có thể đọc chủ đề [tại đây] (https://github.com/SignalR/SignalR/issues/626) – eddo

+0

Bạn có đang trực tiếp phân phát dữ liệu từ dll ** clr của máy chủ sql không ** (máy chủ signalR) cho máy khách signalR? Loại dự án vs là dll này trong? Class Library hoặc Sql Server Database Project? – ibubi

1

Bạn đã xem SignalR chưa? Bạn có thể sử dụng nó để đẩy không đồng bộ dữ liệu vào giao diện người dùng của bạn (mặc dù nó không phải là một sự thúc đẩy thực sự). Điều này có thể không được chấp nhận cho tình huống cụ thể của bạn, nhưng tôi sẽ đề nghị xem xét. Có thể là những gì bạn cần. Hy vọng rằng sẽ giúp.

+1

như tôi đã viết ở trên, tôi đã sử dụng SignalR, vấn đề là luồng dữ liệu giữa SSRV và máy chủ ứng dụng Web, chứ không phải giữa máy chủ ứng dụng Web và ứng dụng khách ... – eddo

Các vấn đề liên quan