执行WCF时进度更新

时间:2012-05-12 04:25:40

标签: c# asp.net .net wcf

我有一个ASP.NET 3.5应用程序在Intranet中使用C#WCF。

该服务按顺序执行三个命令,每个命令需要2-3分钟。我想让用户更新正在运行的命令,例如刷新标签。

我不是这方面的专家,所以我想知道最好的方法是什么。

谢谢,

聚苯乙烯。服务和客户端使用IIS 7.5托管在同一服务器中。

修改

好吧,过去两天我一直在研究这个问题。我不是专家:)

我正在关注Eric的建议,使用WSHttpDualBinding和回调函数。

所以,我能够使用双工绑定构建服务并定义一个回调函数,但是我无法在客户端定义回调函数,请您详细说明。

namespace WCF_DuplexContracts
{
    [DataContract]
    public class Command
    {
        [DataMember]
        public int Id;
        [DataMember]
        public string Comments;
    }



    [ServiceContract(SessionMode = SessionMode.Required, CallbackContract = typeof(ICallbacks))]
    public interface ICommandService
    {
        [OperationContract]
        string ExecuteAllCommands(Command command);
    }

    public interface ICallbacks
    {
        [OperationContract(IsOneWay = true)]
        void MyCallbackFunction(string callbackValue);
    }



    [ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)]
    public class CommandService : ICommandService
    {
        public string ExecuteAllCommands(Command command)
        {
            CmdOne();
            //How call my callback function here to update the client??
            CmdTwo();
            //How call my callback function here to update the client??
            CmdThree();
            //How call my callback function here to update the client??

            return "all commands have finished!";
        }

        private void CmdOne()
        {
            Thread.Sleep(1);
        }

        private void CmdTwo()
        {
            Thread.Sleep(2);
        }

        private void CmdThree()
        {
            Thread.Sleep(3);
        }
    }
}

编辑2

这是客户端实现,

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Client.DuplexServiceReference;
using System.ServiceModel;

namespace Client
{
    class Program
    {
        public class Callback : ICommandServiceCallback
        {
            public void MyCallbackFunction(string callbackValue)
            {
                Console.WriteLine(callbackValue);
            }
        }

        static void Main(string[] args)
        {
            InstanceContext ins = new InstanceContext(new Callback());
            CommandServiceClient client = new CommandServiceClient(ins);

            Command command = new Command();
            command.Comments = "this a test";
            command.Id = 5;

            string Result = client.ExecuteAllCommands(command);
            Console.WriteLine(Result);

        }
    }
}

结果:

C:\>client
cmdOne is running
cmdTwo is running
cmdThree is running
all commands have finished!

2 个答案:

答案 0 :(得分:3)

在回调中使用双工绑定和更新状态。

编辑* 您需要获得对回调通道的引用

public string ExecuteAllCommands(Command command)
    {

        var callback = OperationContext.Current.GetCallbackChannel<ICallbacks>();                  
        CmdOne();
        //How call my callback function here to update the client??
        callback.MyCallbackFunctio("cmdOne done");
        CmdTwo();
        callback.MyCallbackFunctio("cmdTwo done");
        //How call my callback function here to update the client??
        CmdThree();
        callback.MyCallbackFunctio("cmdThree done");
        //How call my callback function here to update the client??

        return "all commands have finished!";
    }

你会非常希望服务方法无效,以免超时

答案 1 :(得分:1)

我会创建一些操作。一个用于启动冗长的命令,另一个用于获取状态。如果您有一个等待命令完成的操作,则会遇到超时问题,无法确定进度。