3

我正在尝试实现一个功能,其中用户上传文件,服务器处理文件并向客户端显示有关处理状态的实时通知,例如验证、导入等。有一些示例客户端将数据从文本框发送到 javascript 代理.

 $("#btnTest").click(function () {
                myHub.testMethodOnHub($("#txtEmail").val());
            });

我需要通过 signalR 将二进制数据发送到服务器,以便服务器可以处理该数据并使用 SignalR 通知客户端。

编辑:- 我能够从 aspx.cs 调用 JS 方法来设置客户端状态 - 实时。但是,页面加载完成后,该消息会消失。

我尝试过的:-

ASPX:-

<%@ Page Title="Home Page" Language="C#" AutoEventWireup="true"
    CodeBehind="Default.aspx.cs" Inherits="MultipleStepsUsingSignalR._Default" %>

<script src="Scripts/jquery-1.6.4.js" type="text/javascript"></script>
<script src="Scripts/json2.js" type="text/javascript"></script>
<script src="Scripts/jquery.signalR-0.5.2.js" type="text/javascript"></script>
<script src="signalr/hubs" type="text/javascript"></script>
<body>

    <form id="Form1" runat="server">
    <p>
        <asp:FileUpload ID="fileUpload" runat="server" />
        <asp:Button ID="btnProcessFile" runat="server" Text="Process File" 
            onclick="btnProcessFile_Click" />
        <asp:HiddenField ID="hdnConnectionId" runat="server"/>
        <%--<asp:Label Text="" ID="lblStatus" runat="server" />--%>
        <span id="lblStatus"></span>
    </p>

  </form>
    <script type="text/javascript">
        $(document).ready(function () {
            var multipleStepsHub = $.connection.multipleStepsHub;

            multipleStepsHub.MethodInJavascript = function (status) {
                $('#lblStatus').append(status);
            };

            $.connection.hub.start().done(function () {
                $('#<%= hdnConnectionId.ClientID %>').val($.connection.hub.id);
                alert($('#lblStatus').text());
            });
        });
    </script>
  </body>

中心

[HubName("multipleStepsHub")]
    public class MultipleStepsHub : Hub
    {
        public void ExecuteMultipleSteps(string status)
        { 

        }
    }

aspx 的代码隐藏

   protected void btnProcessFile_Click(object sender, EventArgs e)
        {
            string connectionId = hdnConnectionId.Value;
            var context = GlobalHost.ConnectionManager.GetHubContext<MultipleStepsHub>();

            byte[] dataFromPostedFile = GetDataFromUploadedFile(fileUpload.PostedFile.InputStream);
            context.Clients[connectionId].MethodInJavascript("<br>File updloaded.");
            Thread.Sleep(5000);
            context.Clients[connectionId].MethodInJavascript("<br>Processing step1");
            Thread.Sleep(5000);
            context.Clients[connectionId].MethodInJavascript("<br>Processing step2");
            Thread.Sleep(5000);
            context.Clients[connectionId].MethodInJavascript("<br>Processing step3");

        }

我期望什么:- 状态文本更改为“处理步骤 1”,然后是“处理步骤 2”,然后是“处理步骤 3”

结果是什么:-

a) 状态会定期发生变化(在 Thread.Sleep 之后),但是,当页面完成时,状态会消失。正如您在下面注意到的那样,“处理步骤 1”和“处理步骤 2”确实出现了,但后来消失了。

在此处输入图像描述

4

3 回答 3

3

你的 JavaScript 方法有一个错误:

multipleStepsHub.MethodInJavascript = function (status) {
            ("#lblStatus").val(status);
};

应该

multipleStepsHub.MethodInJavascript = function (status) {
            $('#<%= lblStatus.ClientID %>').text(status);
};

请注意,ASP.NET 会自动生成 HTML 元素标识符

编辑:如果您不想在上传完成后重新加载页面,那么您需要异步上传文件。在 HTML5 中,很容易实现. 有关如何执行此操作的另一个示例,请参阅此问题

于 2012-08-05T19:50:36.023 回答
1

您不能将常规文件发送到集线器方法。您可以使用常规的 http 处理程序或 mvc 或任何其他框架来发布文件并使用信号器来显示更新。

于 2012-08-05T18:55:11.880 回答
0

protected void btnProcessFile_Click是对服务器的完整回发,这意味着您正在重新加载页面,此时 SignalR 尚未(重新)加载。在页面加载完成后尝试使用 Ajax 请求。

于 2013-11-22T09:48:59.480 回答