C# 在一个控制器方法中运行异步操作并获得该操作';结果是另一个

C# 在一个控制器方法中运行异步操作并获得该操作';结果是另一个,c#,asp.net,asp.net-mvc,wcf,http,C#,Asp.net,Asp.net Mvc,Wcf,Http,我有一个长期运行的操作,您可能会在我的另外两个问题中阅读(供您参考,这里是和) 在整个交易的开始,project公开了一个表单,用户应该在其中指定关于XML文件的所有必要信息,并上传XML文件本身。在该方法中,所有用户输入的数据都被捕获并转到处理此类文件的WCF服务。控制器仅获取了此类处理的任务id。 然后用户被重定向到进度条页面,定期检索任务完成状态,刷新进度条 我的问题来了。当XML文件的处理结束时,我如何返回结果并将其显示给用户 我知道HTTP是无状态协议,但有一种cookie机制可以帮助

我有一个长期运行的操作,您可能会在我的另外两个问题中阅读(供您参考,这里是和)

在整个交易的开始,project公开了一个表单,用户应该在其中指定关于XML文件的所有必要信息,并上传XML文件本身。在该方法中,所有用户输入的数据都被捕获并转到处理此类文件的WCF服务。控制器仅获取了此类处理的任务id。 然后用户被重定向到进度条页面,定期检索任务完成状态,刷新进度条

我的问题来了。当XML文件的处理结束时,我如何返回结果并将其显示给用户

我知道HTTP是无状态协议,但有一种cookie机制可以帮助解决这种情况。当然,我可能只是将处理结果保存到某个临时位置,比如WCF服务器中的静态类,但服务的负载很高,所以它会占用所有提供的内存

换句话说,我希望将任务传递给WCF服务(使用netNamedPipeBinding),并尽可能快地接收结果。我想将临时保存的结果转移到某个缓冲区,并等待客户机将其收集回来


就我而言,使用临时缓冲区的不是服务端而是客户端:

using (XmlProcessingServiceClient client = new XmlProcessingServiceClient())
{
    client.AnalyzeXmlAsync(new Task { fileName = filePath, id = tid });
    client.AnalyzeXmlCompleted += (sender, e) =>
    {
        System.Web.HttpContext.Current.Application.Lock();
        // here is I just use single place for all clients. I know it is not right, it is just for illustrating purposes.
        System.Web.HttpContext.Current.Application["Result"] = e;
        System.Web.HttpContext.Current.Application.UnLock();
    };
}

老实说,我没有真正了解wcf服务器之类的部分,但我想我可以给你更多的抽象答案。可以肯定的是:

  • 你有一个带有一些字段和文件上传的表单
  • 用户填写表单并提供一个XML文件
  • 将XML文件发送给WFC服务,WFC服务将生成该文件
  • 同时显示更新的进度条
  • 完成后显示结果
  • 如果这不是你想要的,或者这不是你的问题,你可以跳过我的答案,否则继续阅读

    在开始之前:步骤3有点含糊不清:它可能意味着我们将数据发送到服务并等待它返回结果,或者我们将数据发送到服务而不等待它返回结果

    情景1:

  • 在视图中创建包含所有必填字段的表单
  • 在控制器中创建处理回发的操作
  • 该操作将向服务发送数据,当服务返回结果时,您的操作将呈现带有结果的视图
  • 在submit按钮上添加一个javascript On click事件。这将触发对服务器端代码的ajax调用,该调用将返回进度
  • javascript显示某种状态栏,显示正确的进度,并每x秒重复一次
  • 控制器完成后,将显示结果
  • 情景2:

  • -
  • -
  • 将数据发送到服务后,控制器将显示一个带有进度条的视图
  • 我们在documentready上添加了一个javascript事件,用于检查xml文件的状态并更新progressbar。(与情况1中步骤4中的onclick事件相同)
  • 当progressbar达到100%时,它将重定向到显示结果的不同页面
  • 这回答了你的问题吗

    致以最良好的祝愿


    BHD

    老实说,我没有真正了解wcf服务器之类的部分,但我想我可以给你更多的抽象答案。可以肯定的是:

  • 你有一个带有一些字段和文件上传的表单
  • 用户填写表单并提供一个XML文件
  • 将XML文件发送给WFC服务,WFC服务将生成该文件
  • 同时显示更新的进度条
  • 完成后显示结果
  • 如果这不是你想要的,或者这不是你的问题,你可以跳过我的答案,否则继续阅读

    在开始之前:步骤3有点含糊不清:它可能意味着我们将数据发送到服务并等待它返回结果,或者我们将数据发送到服务而不等待它返回结果

    情景1:

  • 在视图中创建包含所有必填字段的表单
  • 在控制器中创建处理回发的操作
  • 该操作将向服务发送数据,当服务返回结果时,您的操作将呈现带有结果的视图
  • 在submit按钮上添加一个javascript On click事件。这将触发对服务器端代码的ajax调用,该调用将返回进度
  • javascript显示某种状态栏,显示正确的进度,并每x秒重复一次
  • 控制器完成后,将显示结果
  • 情景2:

  • -
  • -
  • 将数据发送到服务后,控制器将显示一个带有进度条的视图
  • 我们在documentready上添加了一个javascript事件,用于检查xml文件的状态并更新progressbar。(与情况1中步骤4中的onclick事件相同)
  • 当progressbar达到100%时,它将重定向到显示结果的不同页面
  • 这回答了你的问题吗

    致以最良好的祝愿

    如果您有此想法,BHD将不适用于跨机器通信

    如果您想在IIS上托管我们的服务,那么您将需要一个使用HTTP作为传输协议的绑定。请查看允许两个端点发送消息的。这样,服务器可以随时向客户端发送消息。您可以为进度报告创建回调接口。如果任务需要相当长的时间才能完成,那么通过HTTP报告进度的开销就可以了

    另外,如果您想通过Silverlight()使用HTTP上的双工通信,请看一看

    最后,您可以寻找ASP.NET的实现。在CodeProject中,您至少会看到几个