2

現在、処理中のファイルの進行状況レポートをユーザーに提示するための signalR の使用を検討しています。asp.net MVC 4 を使用しています。Ajax 経由で投稿/取得する場合、ステータスの変更に問題はありません。

ファイルをアップロードする必要があるため (ajax を使用しないため、1: ファイルを送信するためにユーザーに js を有効にするよう要求することはできません。2: おそらく HTML5 を除いて、そのようなタスクをすぐに実行できるとは思いません)。 .

編集: ユーザーに JS を要求することはできないと言うとき、それはコア機能であるため、ファイルの送信が JS に依存できないことを意味します。ただし、JS を有効にしている方は、処理の進行状況や別のプログラムへのインポートを確認できるようにしてください。現在、実際のファイル転送の進行状況には関心がありませんが、プログラムへのインポートの現在の状態にステータス メッセージを送り返すことに関心があります。

フォーム Post を呼び出した後、ファイルの処理中に進行状況を更新するという目標を達成するには、どのようなアプローチが提案されますか? ノート:

コード例:

$(function () {
    var fileUploadHub = $.connection.fileUploadHub;

    fileUploadHub.updateProgress = function (value) {
        updateProgressBar(value);
    };

    fileUploadHub.updateStatusText = function (text) {
        alert("you got to updateStatus");
        updateText(text);
    };
    $.connection.hub.logging = true;
    $.connection.hub.start();
});

function updateProgressBar(value) {
    $("#progressbar").progressbar({ value: value });
}

function updateText(text) {
    $("#statusText").append("<li>" + text + "</li>");
}

//Form : モデルに裏打ちされた

@using (Html.BeginForm( "UploadFile", "FileUpload", FormMethod.Post,
    new { enctype = "multipart/form-data"}))
{
    <input type="file" id="Files" name="Files" accept="text/xml" />
    <br />
    <input type="submit" id="submitButton" value="Submit" />
}

コントローラ:

public ActionResult SubmitFile(MyModel model)
{
  ...
  ProcessFile(model.file)
  ...
}

public void ProcessFile(File file)
{
  var myHub = GlobalHost.ConnectionManager.GetHubContext<FileUploadHub>();
  myHub.Clients.updateStatusText("testz");
}

ハブ クラス:

public class FileUploadHub : Hub
{
}
4

1 に答える 1

6

また、ユーザーの SignalR ConnectionId を POST で返送する必要があります。次に、投稿が開始されたら、HubContext を取得する必要があり、POST のロジック全体で、その ConnectionId を介して特定のクライアントに通知を返すことができます。

  1. フォームに input type="hidden" を追加します。

    <input type="hidden" id="mySignalRConnectionIdHidden" name="SignalRConnectionId" />
    
  2. JavaScript が有効になっており、ハブに接続すると仮定すると、非表示の入力の値を、start() コールバックで SignalR からの connectionid の値に設定します。

    $.connection.hub.start().done(function ()
    {
        $("#mySignalRConnectionIdHidden").val($.connection.connectionId);
    });
    
  3. サーバー側への POST の最初のステップでは、ハブの HubContext を取得し、応答するクライアントを取得します。

    // Get the value of the hidden from the request
    string currentClientConnectionId = Request.Form["SignalRConnectionId"];
    
    // Get the hub context
    IHubContext myHubContext = GlobalHost.ConnectionManager.GetHubContext<MyHub>();
    
    // Resolve a the client that corresponds to the current request
    dynamic currentClient = myHubContext.Client(currentClientConnectionId);
    
  4. POST 処理ロジックのさまざまな時点で、アップロードを開始したクライアントにメッセージを送り返すことができるようになりました。

    ... do some stuff ...
    
    currentClient.stepOneCompleted();
    
    .... do some more stuff ...
    
    currentClient.stepTwoCompleted();
    
    ... etc ...
    

明らかに、ステップ 4 でデータをパラメーターとしてクライアントに戻すこともできますが、ここでは示していません。

最後に、JS が有効になっていないか、何らかの理由で接続に失敗したクライアントの場合、フォームの値が POST で空であることを検出でき、SignalR 接続が確立されていないことがわかります。次に、 currentClient = null を設定するだけで、クライアント コールバックを呼び出す場所全体でそれを検出し、コールバックを完全にスキップできます。

于 2012-10-08T18:43:17.430 に答える