gpt4 book ai didi

c# - signalR 在 POST 后使用/持续

转载 作者:行者123 更新时间:2023-12-02 13:31:35 29 4
gpt4 key购买 nike

目前正在研究如何使用 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>");
}

//表单:由模型支持

@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" />
}

Controller :

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
{
}

最佳答案

您还需要做的是通过 POST 发回用户的 SignalR ConnectionId。然后,当帖子开始时,您需要获取 HubContext,并且在整个 POST 逻辑中,您可以通过该 ConnectionId 将通知发送回特定客户端。

  1. 向表单添加输入 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 的第一步是获取您的 Hub 的 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 并在您要调用客户端回调的地方检测它并完全跳过回调。

关于c# - signalR 在 POST 后使用/持续,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12786220/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com