Отключите WCF SOAP Service для обслуживания и предоставьте дружеское сообщение - PullRequest
0 голосов
/ 12 июля 2010

Я размещаю некоторые сервисы SOAP с WCF. Как я могу отключить эти сервисы через конфигурацию в целях обслуживания и т. Д. И предоставить дружественное сообщение потребителю сервиса с чем-то вроде «Запрошенная вами услуга недоступна для обслуживания»??

Ответы [ 3 ]

2 голосов
/ 12 июля 2010

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

Это может стать немного хитрее, когда этисервисные методы не просто возвращают строку, но сложный объект данных - куда вы помещаете это «дружеское» сообщение ??

На самом деле я думаю, что это не может быть сделано на самом деле - поскольку ваши сервисы обычно не "увиденный "реальными людьми, вы не можете просто создать файл app_offline.htm или что-то в этом роде.

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

С WCF это в основном упражнение по обновлению / копированию соответствующей конфигурации, поэтому ваша служба никогда не должна быть недоступна в течение какого-то длительного периода времени (надеюсь!).

Если вам действительно нужно, что вы можете сделать, просто есть служба замены, которая всегда выдаст FaultContract<ServiceDownForMaintenance> - но тогда все клиенты, вызывающие вашу службу, должны будут знать об этом, а они должны будут обработать этот случай и представить ошибку или информациюсообщение.Ваша служба не может обеспечить это ...

1 голос
/ 12 июля 2010

Как насчет этого: создать пользовательское поведение ServiceBehavior для перехвата моих входящих запросов в службу.Затем попросите пользовательское поведение проверить пользовательский флаг в моем конфигурационном файле, например, <add key="IsMyServiceUp" value="true" />, и если это значение вернется как false, то сгенерируйте ServiceException с моим дружеским сообщением и HTTP-кодом 503 - Служба недоступна.

Это звучит разумно?Затем все, что мне нужно сделать, это изменить флаг в моем конфигурационном файле, чтобы указать, где служба работает или нет.

0 голосов
/ 13 июля 2010

Хорошо, поэтому я создал новое пользовательское поведение, которое реализует IOperationBehavior.В методе Validate у меня есть

public void Validate(OperationDescription operationDescription)
    {
        bool isServiceUp = Boolean.Parse(ConfigurationManager.AppSettings["IsOrderServiceUp"].ToString());
        if (!isServiceUp)
        {
            throw new ServiceException(ServiceErrorCode.Generic_Server_Exception,
            ServiceErrors.Generic_Server_Exception,
            SoapFaultCode.Server);
        }
    }

Другие реализованные методы ApplyClientBehavior, ApplyDispatchBehavior и AddBindingParameters - все пустые.

Я украсил одну из своих услугоперации с [ServiceStatusValidation], который является именем класса моего пользовательского поведения.

Когда я запускаю службу и перехожу к операции с этим украшением, я НЕ получаю исключение, которое я выбросил.SOAP UI не показывает ничего, как возвращено на панели ответов, и мой потребляющий фасад REST выдает общую ошибку 400 с сообщением об исключении: «Сервер не предоставил значимого ответа;это может быть вызвано несоответствием контракта, преждевременным завершением сеанса или внутренней ошибкой сервера. '.

Есть идеи?Должен ли я использовать эту логику в одном из других методов, которые я не реализовал, вместо метода Validate?

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