C# 从服务器到客户端的回调

C# 从服务器到客户端的回调,c#,asp.net,asp.net-mvc,asp.net-mvc-4,C#,Asp.net,Asp.net Mvc,Asp.net Mvc 4,我正在使用ASP.NETMVC4应用程序,我需要在客户端显示消息,通过从控制器向客户端发送消息 我的要求是用户在UI中单击一个按钮,我将处理服务器上的文件,并在我处理的每个文件的末尾在UI中显示消息。我需要使用ASP.NET MVC在客户端显示文件名 任何人都可以通过每次从服务器上为每个循环调用Client方法来帮助如何在客户机中显示消息 我可以调用控制器并结束向UI发送最终消息的每个控制器,但如何在每次foreach循环迭代中发送?您必须编写一个ActionResult,逐步将结果写入响应。因

我正在使用ASP.NETMVC4应用程序,我需要在客户端显示消息,通过从控制器向客户端发送消息

我的要求是用户在UI中单击一个按钮,我将处理服务器上的文件,并在我处理的每个文件的末尾在UI中显示消息。我需要使用ASP.NET MVC在客户端显示文件名

任何人都可以通过每次从服务器上为每个循环调用Client方法来帮助如何在客户机中显示消息


我可以调用控制器并结束向UI发送最终消息的每个控制器,但如何在每次foreach循环迭代中发送?

您必须编写一个
ActionResult
,逐步将结果写入响应。因此,您可以在每次foreach循环迭代中向用户显示一些数据。我写了一个简单的
ActionResult
,每2秒写一个数字:

public class ProgressiveResult : ActionResult
{
    public override void ExecuteResult(ControllerContext context)
    {
        for (int i = 0; i < 20; i++)
        {
            context.HttpContext.Response.Write(i.ToString());
            Thread.Sleep(2000);
            context.HttpContext.Response.Flush();
        }
        context.HttpContext.Response.End();
    }
}
因此,您可以在
executesult
方法中编写
ActionResult
foreach
代码

更新:

您可以使用Ajax请求进行此调用,并使用以下简单代码返回结果:

var result = "";
function showResult() {
    if (result !== oReq.responseText) {
        result = oReq.responseText;
        console.log(result);
    }
}
var oReq = new XMLHttpRequest();
oReq.open("get", "/Home/LongProcess", true);
oReq.send();
setInterval(showResult, 1000);
试试这个: 根据所需的预定义间隔更新进度的脚本方法

控制器:

public class HomeController : Controller
{
    private static IDictionary<Guid, int> tasks = new Dictionary<Guid, int>();

    public ActionResult Index()
    {
        return View();
    }

    public ActionResult Start()
    {
        var taskId = Guid.NewGuid();
        tasks.Add(taskId, 0);

        Task.Factory.StartNew(() =>
        {
            for (var i = 0; i <= 100; i++)
            {
                tasks[taskId] = i; // update task progress
                Thread.Sleep(50); // simulate long running operation
            }
            tasks.Remove(taskId);
        });

        return Json(taskId);
    }

    public ActionResult Progress(Guid id)
    {
        return Json(tasks.Keys.Contains(id) ? tasks[id] : 100);
    }
}
公共类HomeController:控制器
{
私有静态IDictionary任务=新字典();
公共行动结果索引()
{
返回视图();
}
公共行动结果开始()
{
var taskId=Guid.NewGuid();
任务。添加(任务ID,0);
Task.Factory.StartNew(()=>
{
对于(变量i=0;i=100){
updateMonitor(任务ID,“已完成”);
clearInterval(intervalId);
}否则{
updateMonitor(任务ID,进度+“%”);
}
});
}, 100);
});
});
});


开始新任务…

请编辑您的问题并添加代码。在没有看到您的代码的情况下很难回答您的问题。添加的代码请帮助请显示您的查看代码,仅显示您要显示消息的部分。@{ViewBag.Title=“将数据上载到SVN”;}
@ViewBag.Message--显示文件名--在每个foreach Thnaks上的视图中显示消息,但如何在UIHey中显示响应消息当用户单击“提交”按钮时,我正在呼叫控制器。@using(Html.begin)(“索引”,“主页”,FormMethod.Post,new{id=“formUpload”,enctype=“multipart/form data”,onsubmit=“progressStatus();”}){Upload File
@ViewBag.Message
如果调用函数progressStatus(){debugger;var oReq=new XMLHttpRequest();oReq.open(“get”,“/Home/ProcessMessage”,true);oReq.send();setInterval(showResult,1000);函数showResult(){if(result!==oReq.responseText){result=oReq.responseText;$(“#progressbar”).html(result);}}在
上,我收到HTTP错误,请不要通过SO共享代码。对话流必须在网站中永久存在,通过google drive永久共享这卷代码不是一个好主意。最好专门讨论错误。请提供有关您遇到的异常或http错误的详细信息。我的问题是,我正在调用
上的java脚本方法,因此,如果调用此方法,我将在c#context.HttpContext.Response.Flush()上遇到错误;如何调用submit方法和Javascript方法,因为按钮是submit,它调用的是我控制器的索引。在progressStatus方法中,我有您给出的代码..输入在@using下(Html.BeginForm(“Index”,“Home”,FormMethod.Post,new{id=“formUpload”,enctype=“multipart/form data”})),这是客户端到服务器,我希望服务器调用客户端方法。。如下图所示,但要在UI中显示
public class HomeController : Controller
{
    private static IDictionary<Guid, int> tasks = new Dictionary<Guid, int>();

    public ActionResult Index()
    {
        return View();
    }

    public ActionResult Start()
    {
        var taskId = Guid.NewGuid();
        tasks.Add(taskId, 0);

        Task.Factory.StartNew(() =>
        {
            for (var i = 0; i <= 100; i++)
            {
                tasks[taskId] = i; // update task progress
                Thread.Sleep(50); // simulate long running operation
            }
            tasks.Remove(taskId);
        });

        return Json(taskId);
    }

    public ActionResult Progress(Guid id)
    {
        return Json(tasks.Keys.Contains(id) ? tasks[id] : 100);
    }
}
<script type="text/javascript">

function updateMonitor(taskId, status) {
    $("#" + taskId).html("Task [" + taskId + "]: " + status);
}

$(function () {

    $("#start").click(function (e) {
        e.preventDefault();

        $.post("Home/Start", {}, function (taskId) {

            // Init monitors
            $("#monitors").append($("<p id='" + taskId + "'/>"));
            updateMonitor(taskId, "Started");

            // Periodically update monitors
            var intervalId = setInterval(function () {

                $.post("Home/Progress", { id: taskId }, function (progress) {
                    if (progress >= 100) {
                        updateMonitor(taskId, "Completed");
                        clearInterval(intervalId);
                    } else {
                        updateMonitor(taskId, progress + "%");
                    }
                });

            }, 100);

        });
    });

});