2012-05-12 5 views
2

У меня есть приложение 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! 

ответ

3

Использовать режим двустороннего связывания и обновления в обратном вызове.

EDIT * Вы должны получить ссылку на обратный вызов канал

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!"; 
    } 

Вы хотите Prolly метод обслуживания ничтожный, чтобы не таймаут

+0

Мне удалось создать службу, но я не могу определить функцию на стороне клиента, пожалуйста, см. Мое редактирование. Благодарю. – m0dest0

+0

См. Мое редактирование для реализации службы. Вам также понадобится реализовать ICallbacks на клиенте – Eric

+0

Thx Eric, я смог реализовать код на стороне клиента (см. EDIT 2). Наконец, можете ли вы прокомментировать, почему метод службы следует избегать не время. – m0dest0

1

Я хотел бы создать несколько операций. Один для запуска длинной команды, а другой - для получения статуса. Если у вас есть одна операция, которая ждет завершения команды, вы столкнетесь с проблемой тайм-аутов и не сможете понять прогресс.

+0

Команда выполняется последовательно .. это тайм-аут, о котором вы упомянули? – m0dest0

+0

пара для каждого, команда и прогресс (т. Е. 6 операций) ... –

Смежные вопросы