Тайм-аут на стороне сервера WCF - PullRequest
3 голосов
/ 19 июля 2009

Есть ли способ сообщить службе WCF об ответе на запрос (с или без прерывания его обработки) через определенное время, даже если он еще не завершен, что-то вроде политики тайм-аута на стороне сервера?

Ответы [ 4 ]

2 голосов
/ 19 июля 2009

Полагаю, вы могли бы сделать это, запустив новый поток, как только начнется операция WCF. Затем в новом потоке происходит настоящая работа, и исходный поток запроса WCF ожидает использования Thread.Join () с определенным таймаутом. Если истекло время ожидания, рабочий поток можно отменить с помощью Thread.Abort ().

Примерно так:

public string GetData(int value)
{
    string result = "";
    var worker = new Thread((state) =>
    {
        // Simulate l0ng running
        Thread.Sleep(TimeSpan.FromSeconds(value));
        result = string.Format("You entered: {0}", value);
    });

    worker.Start();

    if (!worker.Join(TimeSpan.FromSeconds(5)))
    {
        worker.Abort();
        throw new FaultException("Work took to long.");
    }

    return result;
}
1 голос
/ 16 июня 2012

Я решил ту же проблему и создал пост в блоге:

http://kanchengcao.blogspot.com/2012/06/adding-timeout-and-congestion.html

Короче говоря:

  1. Конфигурация тайм-аута сервера WCF не работает
  2. Вы могли бы реализовать тайм-аут, как говорили другие
  3. Такой тайм-аут не гарантирует своевременного ответа клиенту, поскольку запрос может быть поставлен в очередь на долгое время, прежде чем вводить код с тайм-аутом.

Таким образом, я реализовал метод отбрасывания запросов, если сервер перегружен и, как ожидается, приведет к увеличению времени ожидания.

0 голосов
/ 11 июня 2010

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

Затем, если тайм-аут наступает до того, как на запрос можно будет ответить реальным способом, затем вызовите их обратный вызов. Стек WCF обеспечивает это, когда вызывает ваш

BeginFoo( fooParam1, fooParam2, AsyncCallback callback, object state)

Затем сгенерируйте или верните свою ошибку или тайм-аут исключения или ответ в соответствующем методе EndFoo().

Убедитесь, что больше не перезваниваете на их обратный вызов, если в итоге придет реальный ответ.

Потребуется некоторое время, чтобы привыкнуть к асинхронному программированию wcf, но нет, очевидно, нет настройки на стороне сервера.

Кроме того, вам следует попытаться использовать клиент, который поддерживает тайм-аут или отменяемые запросы, поскольку вы не можете рассчитывать на то, что сервер запросит у вас время. Возможно, отсутствует соединение или на сервере есть другая проблема.

Ура, Chris

0 голосов
/ 20 июля 2009

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

Если бы мне пришлось это сделать, веб-служба передала бы запрос отдельной службе Windows, возможно, с использованием WCF поверх MSMQ. У меня будет тайм-аут по этому запросу. Если бы запрос не завершился вовремя, я бы просто вернул ошибку Timeout. Фактический запрос не будет затронут.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...