我有一个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!
答案 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)
我会创建一些操作。一个用于启动冗长的命令,另一个用于获取状态。如果您有一个等待命令完成的操作,则会遇到超时问题,无法确定进度。