У меня есть приложение ASP.NET 3.5, использующее C# WCF в интрасети.Обновление выполнения во время WCF
Служба выполняет три команды последовательно, занимая 2-3 минуты каждый. Я хочу, чтобы пользователь обновлялся с помощью выполняемой команды, например, обновляя метку.
Я не специалист по этому вопросу, поэтому я хотел бы знать, что является лучшим способом сделать это.
Thanks,
Ps. Служба и клиент размещаются на одном сервере с помощью IIS 7.5.
EDIT
Ну, я работал над этим в течение последних двух дней .. Я не эксперт :)
Я следую за предложение Эрика, использование 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);
}
}
}
EDIT 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!
Мне удалось создать службу, но я не могу определить функцию на стороне клиента, пожалуйста, см. Мое редактирование. Благодарю. – m0dest0
См. Мое редактирование для реализации службы. Вам также понадобится реализовать ICallbacks на клиенте – Eric
Thx Eric, я смог реализовать код на стороне клиента (см. EDIT 2). Наконец, можете ли вы прокомментировать, почему метод службы следует избегать не время. – m0dest0