2013-05-21 4 views
1

I Реализовано HttpListener для обработки SoapRequests. Это работает отлично, но я не могу найти решение проблемы, что некоторые запросы на мыло занимают слишком много времени, что приводит к таймаутам на стороне клиента.HttpListener prevent Timeout

Как сообщить запрашивающему клиенту, что его запрос не является таймаутом?

Я думал о посылке «фиктивной» информации, пока запрос обрабатывается, но HttpListener, похоже, отправляет данные только тогда, когда вы отвечаете на объект ответа, и это можно сделать только один раз, так что это не так что я должен делать.

Soloution:

Thread alliveWorker = new Thread(() => 
{ 
    try 
    { 
     while (context.Response.OutputStream.CanWrite) 
     { 
      context.Response.OutputStream.WriteByte((byte) ' '); 
      context.Response.OutputStream.Flush(); 
      Thread.Sleep(5000); 
     } 
    } 
    finally 
    { 

    } 
}); 

alliveWorker.Start(); 


doWork(); 

alliveWorker.Interrupt(); 

createTheRealResponse(); 

ответ

0

Отправка фиктивной информации не плохая идея.

Мне кажется, вам нужно позвонить по методу Flush() на HttpListenerResponseOutputStream после записи фиктивных данных. Также необходимо включить SendChunked свойства:

Попробуйте отправить фиктивное пространство на очередном интервале:

response.SendChunked = true; 
response.OutputStream.WriteByte((byte)' '); 
response.OutputStream.Flush(); 
+0

То, что я тоже думал, но это, похоже, не работает. Он отправляет всю информацию в один кусок, когда я закрываю ответ. – CSharpie

+0

Вы установили свойство 'SendChunked'? –

+0

Это сделало трюк. Спасибо. – CSharpie

0

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

+0

Я надеялся не делать этого, но я думаю, что это будет так, когда нет другого предложения. – CSharpie

0

Если вы используете .net 4.5, взгляните на HttpListenerTimeoutManager Class, вы можете использовать этот класс в качестве базы для реализации пользовательского тайм-аута.

+0

К сожалению нет, я обновлю информацию. – CSharpie