1

ページからのアップロードを処理する ApiController で signalr を使用しようとしています。

基本的に、uploadController から Hub を呼び出してから、クライアントと話したいと考えています。

アップロード コントローラーを短縮すると、次のようになります。

public class UploadController : ApiController
{
  public Task<HttpResponseMessage> PostFile()
    {
        var hubMan = new HubManager();
        hubMan.showUpload("test");
    }
 }

次に、クライアントへの送信を処理する HubManager を用意します。

public class HubManager : Hub
{

    public HubManager()
    {
    }

    public void showUpload(string src)
    {
        Caller.showUpload(src);
    }

}

私も私のshowUploadでこれを試しました:

public void showUpload(string str)
    {
        var context = GlobalHost.ConnectionManager.GetHubContext<HubManager>();
        context.Clients[this.Context.ConnectionId].showUpload(str);
    }

私のクライアント側のコードは次のようになります。

$(document).ready(function () {

var progress = $.connection('/signalr/hubs/hubManager');

progress.showUpload = function (src) {
    alert(src);
};

// Start the connection
$.connection.hub.start();
});

問題は、私の Hub クラスではすべてが Null であることです。私の発信者、クライアント、およびコンテキストは null です。そのため、何かが正しく初期化されていないようです。

助言がありますか?

4

1 に答える 1

4

SignalR ハブのインスタンスを自分で作成することはできません。クライアントなどのプロパティを使用できるように、ハブは SignalR によって初期化する必要があります。

ハブの外部 (コントローラーなど) からクライアントにブロードキャストする場合は、wiki で説明されているように、ハブのコンテキスト オブジェクトを使用する必要があります。

public ActionResult ControllerAction()
{
    var context = GlobalHost.ConnectionManager.GetHubContext<HubManager>();
    context.Clients[ /* connectionId or group name */ ].showUpload();
    // ...
}

SignalR ではなく ApiController を呼び出しているため、アクセスできないことに注意してくださいcontext.ConnectionIdcontext.Callerこの場合、フレームワークは ConnectionId について何も知りません。Cookie やコントローラー アクションのパラメーターなど、別の方法でコントローラーに渡す必要があります。

于 2012-07-23T15:13:14.337 に答える