0

POC用のサンプルsignalRを作成しました。Global.asaxからハブメソッドを呼び出し、文字列値をクライアントに渡したい。私のメッセージハブは:-

[HubName("messageHub")]
public class MessageHub : Hub
{
    public static IHubContext context = GlobalHost.ConnectionManager.GetHubContext<MessageHub>();
    public void Message()
    {

        /*
         * services and updates the messages
        * property on the PushMessage hub
        */
        //IHubContext context = GlobalHost.ConnectionManager.GetHubContext<SignalR_Error_Logging.Models.ErrorModel>();
        List<GenerateError.Repository.ErrorModel> model = ErrorRepository.GetError();
        context.Clients.pushMessages(model[0].ErrorMessage);

    }

layout.cshtmlで2つのスクリプトを定義しました

<script type="text/javascript" src="../../Scripts/jquery-1.6.4.js"></script>
<script type="text/javascript" src="../../Scripts/jquery.signalR-0.5.3.js"></script>

私のIndex.htmlは以下の通りです:-

    @{
    ViewBag.Title = "Receive Error message";
    Layout = "~/Views/Shared/_Layout.cshtml";
}
<script src="/signalr/hubs" type="text/javascript"></script>
<script type="text/javascript">
    $(function () {
        var myHub = $.connection.messageHub;
        myHub.pushMessages = function (value) {
            console.log('Server called addMessage(' + value + ')');
            $("#messages").append("<li>" + value + "</li>");
        };
        $("#btnMessage").click(function () {

            myHub.message();
        });
        $.connection.hub.start().done(function () { alert("Now connected!"); }).fail(function () { alert("Could not Connect!"); });
    });

</script>
<h2>Receive Error Messages</h2>
<ul id="messages"></ul>
<input type="button" id="btnMessage" value="Get Error" />

Global.asaxで私は書いた

SignalR_Error_Logging.SignalRHub.MessageHub hub = new SignalRHub.MessageHub();
        hub.Message();

Application_Start();

UI(つまり、Index.cshtml)にメッセージを表示できません。

私が試したこと:-

  • アプリケーションをIISとして実行します。
  • HubContextの作成方法を変更します。

        IHubContext _context = GlobalHost.ConnectionManager.GetHubContext<MessageHub>();
    context.Clients.notify("Hello world");
    
  • if (Clients != null) { Clients.shootErrorMessage(message); this.Clients.shootErrorMessage(message); }

  • システムの他の場所からのStackoverflowCallingSignalRハブクライアントのリンクを通過しました

何かアドバイス???

Index.htmlでボタンを作成してハブメソッドを呼び出すと、正常に機能します。

私の質問を適切に組み立てなかったことをお詫びします!!

4

2 に答える 2

2

ハブの呼び出し方法が正しくないことがわかりました。とりあえず、Global.asaxのようにコードを変更しました:-

 private void CallSignalR()
    {
        var context = SignalR.GlobalHost.ConnectionManager.GetHubContext<SignalR_Error_Logging.SignalRHub.MessageHub>();
        List<GenerateError.Repository.ErrorModel> err = GenerateError.Repository.ErrorRepository.GetError();
        foreach (var item in err)
        {
            item.ErrorDescription = item.ErrorDescription + DateTime.Now.ToString();
        }
        context.Clients.pushMessages(err);


    }

今は絶対にうまくいきます:)

まだより良い選択肢を考えています!!!!

于 2012-10-12T13:33:40.467 に答える
1

これは決して機能しません。Global.asaxのApplication_Start()は、AppDomainの存続期間中に1回だけ呼び出されます。これは、Webサイトの起動時に発生し、この時点ではまだクライアントが接続されていないため(Webサイトが完全に初期化されていないため)、SignalRを介してメッセージを送信することはできません。

于 2012-10-11T12:24:46.987 に答える