2013-02-10 4 views
1

У меня есть серверное приложение, которое еще одно приложение EXEC, второе приложение создает файл журнала, и я хочу, чтобы сервер отправил его клиенту через WCF.потокового файла, в то время как ГЭС написано в WCF

Я хочу, чтобы клиент прочитал журнал, в то время как приложение EXEC обновило его.

Я использовал рабочий договор, который возвращает поток (файл журнала). проблема заключается в том, что при первом отправке потока журнал по-прежнему пуст, и клиент не видит «обновление», которое пишет сервер EXEC.

здесь код сервера:

public Stream GetLog() 
    { 
     Stream stream = new FileStream(@"Log.txt", FileMode.Open, FileAccess.Read, FileShare.ReadWrite); 
     return stream; 
    } 

ехес с сервера просто запись в файл "Log.txt"

здесь код клиента:

 public void SaveLog() 
    { 
     Stream stream = ServerProxy.GetLog(); 
     StreamWriter writer = new StreamWriter("NEWLog.txt"); 
     writer.AutoFlush = true; 
     StreamReader reader = new StreamReader(stream); 
     char[] buf = new char[100]; 
     int count = 0; 
     while (count = reader.ReadBlock(buf, 0, 100) > 0) 
     { 
      writer.Write(buf, 0, count); 
     } 
     stream.Close(); 
     writer.Close(); 
    } 

как я могу обновить клиент с помощью журнала REAL-TIME?

+0

Как вы читаете из файла журнала в клиенте? Вы только показываете, как вы его открываете. –

+0

У меня есть считыватель потока. его написано в коде клиента. – IsraelKo

+0

Это поможет, если вы включили свой код, поскольку этот комментарий не поможет более четко объяснить, почему ваша логика не работает. –

ответ

1

Я думаю, что ваши привязки неверны. вы должны установить ваш transferMode="Streamed"

там вы можете найти пример:

http://msdn.microsoft.com/en-us/library/ms751463.aspx

+0

Я использовал этот параметр, но клиентский поток не обновлялся с изменениями потоком сервера. – IsraelKo

+0

@IsraelKo попробуйте использовать basicHttpBinding – giammin

0

Есть несколько возможностей. Можете ли вы изменить контракт? Если вы можете использовать привязку к сеансу, такую ​​как netTcpBinding, вы можете изменить свой контракт, чтобы использовать контракт обратного вызова, где обратный вызов используется для публикации новых данных журнала.

[ServiceContract] 
public interface ILogCallback 
{ 
    [OperationContract(IsOneWay = true)] 
    void NewLog(string logString); 
} 

[ServiceContract(CallbackContract = typeof(ILogCallback))] 
public interface ILog 
{ 
    /// Call this method to sign up for future log messages, 
    /// which will be sent to the callback NewLog. 
    [OperationContract] 
    void SignMeUpForLogs(); 
} 

Какие приспособления вы можете использовать? Являются ли сеансы жизнеспособной альтернативой или вы должны использовать PerCall?

С уважением, Фредрик

+0

Я использую NetTcpBinding, и ваше решение действительно решает проблему, но реализация затруднена, чтобы сохранить всех подписчиков, желающих журнал, и управлять потоком, чтобы поймать изменения в файле журнала и обновить всех подписчиков. Я буду рад, если мой простой код будет работать. – IsraelKo