2

リクエストがなくても、クライアントのオンとボードのメッセージSignalRを認識したい。(つまり、クライアントがサービスに最初のリクエストを送信した後、サービスはクライアントを認識してメッセージを送信できます)。JqueryWCF service

これがこれを行うための最良の方法であるかどうかはわかりませんが、それが私が見つけたすべてです。(VS 2012 でのみサポートされている WebSocket を除く)。

Globalサービスのファイルに次の機能を追加しました。

protected void Application_Start(object sender, EventArgs e)
{
   RouteTable.Routes.MapHubs();
}

Chat.cs を作成しました。

public class Chat : Hub
{
    public void Send(string message)
    {
        // Call the addMessage method on all clients
        Clients.All.addMessage(message);
    }
}

JSプロジェクトでは、次のファイルを追加しましJSSignalR

<script src="../JavaScript/jquery.signalR-1.1.2.min.js" type="text/javascript"></script>
<script src="/signalr/hubs" type="text/javascript"></script>

それを使用する関数:

function Chat() {

    $(function () {
        // Proxy created on the fly          
        var chat = $.connection.chat;

        // Declare a function on the chat hub so the server can invoke it          
        chat.client.addMessage = function (message) {
            alert(message);
        };

        // Start the connection
        $.connection.hub.start().done(function () {
            // Call the chat method on the server
            chat.server.send('aa');
        });
    });

}

これは私にとって新しいことなので、質問がばかげている場合は申し訳ありませんが、JS の SignalR はどのように Service を知る必要がありますか? どこで彼を定義する必要がありますか? (これにはクロスドメインが必要です)

(変数$.connection.chatは未定義です)

私はいくつかのことを見逃したと確信しています

4

2 に答える 2

2

私が見逃していたのは、クロスドメインで SignalR を使用することです。

グローバルファイルでコードを変更しました:

protected void Application_Start(object sender, EventArgs e)
{
  RouteTable.Routes.MapHubs(new HubConfiguration() { EnableCrossDomain = true });
}

ここで重要なことは、私はクロスドメインを使用しているため、リクエストApplication_BeginRequestが完了したときにキャンセルするコードが関数内にあるということです。それ以外の場合は機能しません。だから私はこのようにそれをキャンセルしました:SignalR

 protected void Application_BeginRequest(object sender, EventArgs e)
        {
            //Here is testing whether this request SignalR, if not I do the following code
            if (HttpContext.Current.Request.Path.IndexOf("signalr") == -1)
            {
                HttpContext.Current.Response.Cache.SetCacheability(HttpCacheability.NoCache);

                HttpContext.Current.Response.Cache.SetNoStore();

                HttpContext.Current.Response.AddHeader("Access-Control-Allow-Origin", "*");

                if (HttpContext.Current.Request.HttpMethod == "OPTIONS")
                {

                    HttpContext.Current.Response.AddHeader("Access-Control-Allow-Methods", "GET, POST");

                    HttpContext.Current.Response.AddHeader("Access-Control-Allow-Headers", "Content-Type, Authorization, Accept, x-requested-with");

                    HttpContext.Current.Response.AddHeader("Access-Control-Max-Age", "1728000");

                    HttpContext.Current.Response.End();

                }
            }
        }

クライアントで:

SignalRとのスクリプトを追加し、次のスクリプトJqueryを削除しました。

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

クロスドメイン呼び出しがあるため、必要ありません。

接続は次の関数にあります。

var connection;
var contosoChatHubProxy;

function RegisterToServiceMessege() {
    connection = $.hubConnection();
    connection.url = 'http://localhost:xxx/signalr';
    contosoChatHubProxy = connection.createHubProxy('ChatHub');
    //This part happens when function broadcastMessage is activated(from the server)
    contosoChatHubProxy.on('broadcastMessage', function (userName, message) {
        alert('You have a messege:\n' + userName + ' ' + message);
    });
    connection.start()
    .done(function () {
        console.log('Now connected, connection ID=' + connection.id);
    })
    .fail(function () { console.log('Could not connect'); });
}

サーバー上の Chat.cs:

 [HubName("ChatHub")]
    public class Chat : Hub
    {
        [HubMethodName("Send")]
        public void Send(string name, string message)
        {
            // Call the broadcastMessage method to update clients.
            Clients.All.broadcastMessage(name, message);
        }
    }

顧客の 1 人からの関数の呼び出しSendは次のとおりです。

function SendMessege() {
    contosoChatHubProxy.invoke('Send', 'aaa', 'bbb').done(function () {
        console.log('Invocation of NewContosoChatMessage succeeded');
    }).fail(function (error) {
        console.log('Invocation of NewContosoChatMessage failed. Error: ' + error);
    });

}

すべてのクライアントは、送信されたメッセージを受信します。

(これは、複数のブラウザーを同時に実行することで確認できます。)

于 2013-07-09T06:38:51.497 に答える
1

SignalR のバージョン 2.0 以降、次のコードを使用して Cors を有効にすることはできなくなりました。

    protected void Application_Start(オブジェクト送信者, EventArgs e)
    {
      RouteTable.Routes.MapHubs(新しい HubConfiguration() { EnableCrossDomain = true });
    }

代わりに、Startup クラスの初期化メソッドに次の 2 行を追加する必要があります。

public void Configuration(IAppBuilder app)
{
    app.UseCors(CorsOptions.AllowAll);
    app.MapSignalR();           
}

また、セルフホスティング ライブラリを使用して SignalR をホストしたくない場合は、プロジェクトを WebApplication に変更することを忘れないでください。私の場合、Signalr を WCFProject に追加しようとしていました。また、ランタイムは Startup のこの Configuration メソッドにさえ移動しないため、シグナル リソースへのアクセスを禁止する一定のエラーが発生します。

于 2014-03-14T08:53:41.537 に答える