0

ASP.NET 4.5 Web フォームでSignalRを使用しています。クライアントをサーバーと通信させることができませんでした。私が達成したいのは、クライアントがサーバー機能をトリガーする方法と、サーバーがクライアント機能をトリガーする方法をテストできることです。私が使用するコードは次のとおりです。

クライアント側コード (HitCounter.aspx)

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title></title>
<script type="text/javascript" src="Scripts/jquery-1.8.2.js"></script>
<script src="Scripts/jquery.signalR-0.5.3.min.js"></script>
<script type="text/javascript" src="SignalR/Hubs"></script>

<style>
    #currentHitCount {
        font-family: Arial;
        font-size:40pt;
        margin-left:auto;
        margin-right:auto;
        display:block;
        text-align:center;
    }

</style>
</head>
<body>
<div id="currentHitCount"></div>
<script type="text/javascript">

    $(function () {
       var hub = $.connection.hitCounter;

       $.extend(hub, {
           showHitCount: function (hitCount){
               if(hitCount > 1){
                   $('#currentHitCount')
                   .html("This site has had " + hitCount + " hits.");
               }
               else{
                   $('#currentHitCount')
                   .html("This site has had " + hitCount + " hit.");
               }
           },
           addMessage: function (str) {
               $('#currentHitCount')
               .html("Getting Message: " + str);
           }
       });

       $.connection.hub.start(function () {
           hub.addMessage("test");
           hub.addHit();

       });

       $.connection.hub.stateChanged(function (change) {
           if ($.signalR.connectionState["connected"] === change.newState) {                  
           }
       });

       $.connection.hub.error(function () {
       });

   });


   </script>
  <div style="background-color:red; width:290px; height:200px; color:white; position:absolute; top:100px; left:30px;" id="thebutton">test</div>

</body>
</html>

サーバー側コード (App_Code/HitCounterHub.cs)

using SignalR.Hubs;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using System.Web;

[HubName("hitCounter")]
public class HitCounterHub : Hub, IDisconnect
{
    static int _hitCount;

public void addHit(string pageId)
{
    _hitCount += 1;
    Clients.showHitCount(_hitCount);

}

public Task ClientCallingServer()
{
    _hitCount += 1;
    return Clients["foo"].showHitCount(_hitCount);
}


public Task Join()
{
    return Groups.Add(Context.ConnectionId, "foo");
}

public Task Send(string message)
{
    _hitCount += 1;
    return Clients["foo"].addMessage(message);       
}


public Task Disconnect()
{
    return Clients["foo"].leave(Context.ConnectionId);
}
}

IIS7.5 でローカルにコードを実行していますが、Visual Studio 2012 でもコードを実行するとエラーが発生します。

エラー:

localhost/signalr/signalr/send?transport=serverSentEvents&connectionId=400f1302-6c8e-418e-a14c-da95f836a29d 500 (内部サーバー エラー)

Chrome デバッガーを使用すると、エラー ページに次 のように表示されます。 「addHit」メソッドを解決できませんでした。

繰り返しますが、私がやろうとしているのは、クライアントからサーバーを呼び出し、サーバーからクライアントを呼び出す方法を確認する簡単なテストを作成することです。

ありがとう。

4

1 に答える 1

2

addHit メソッドを解決できない理由は、クライアントと同じ関数名がサーバーにあるためです。

別名hub.addHit( "laksjdf")を実行しているサーバーを呼び出すには。ただし、クライアントを呼び出す場合は同じです: hub.addHit("laksjdfldksj"); したがって、あいまいさがあります。クライアントまたはサーバー側の関数の名前を変更して、命名の意味で一意になるようにします。

この問題は、SignalR の次のリリースで修正される予定です。

于 2012-09-29T17:39:19.143 に答える