2015-09-10 6 views
0

У меня есть несколько служб WCF в моем проекте и я хотел бы добавить новый метод для всех из них, не меняя каких-либо сервисов. Можно ли это сделать в C#?Расширение служб WCF

Пусть говорят услуги

  1. MyService1.svc
  2. MyService2.svc
  3. Myservice3.svc

Теперь я хочу, чтобы выставить метод, называемый "HealthyStatus()" в все они так, чтобы клиенты могли использовать этот метод. Этот метод реализован в другом классе под названием «HeathCheckerService.cs»

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

Заранее спасибо.

+3

Вы не можете этого сделать. – Chandru

+0

Что такое * актуальная * проблема? Почему вы не можете изменять службы? Класс WCF Service * - это * служба, а методы * - это операции. WSDL * * генерируется из этих классов и методов. Добавление новой операции означает добавление нового метода. –

+0

Это вопрос о версии? «Добавление метода» означает нарушение существующего WSDL, потому что вы добавили новую операцию. Вы пытаетесь поддержать новую операцию, не нарушая предыдущих клиентов? –

ответ

0

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

Одним из способов добиться того, что вы хотите, является размещение новой конечной точки службы с помощью операции HealthyStatus(), которая затем вызывает другие службы (в некотором неинтрузивном порядке) и возвращает статус. Но это потребует, чтобы ваши другие службы выставляли операцию, которую можно было бы назвать без последствий, и ваше определение того, что на самом деле означает здоровый статус.

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

Если вы счастливы, чтобы обновить вашу службу, вероятно, наименее навязчивый, что нужно сделать было бы создать новый контракт на обслуживание, как:

[ServiceContract] 
public interface IHealthCheckServiceContract 
{  
    [OperationContract]  
    int CheckStatus(); 
} 

и затем все ваши другие сервисные контракты реализовать:

[ServiceContract] 
public interface IMyService1 : IHealthCheckServiceContract 
{ 
    ...  
} 

[ServiceContract] 
public interface IMyService2 : IHealthCheckServiceContract 
{ 
    ...  
} 

Очевидно, что при таком подходе вы могли бы подкласс ваши implmentations сервис

public abstract class HealthChecker 
{ 
    public abstract int CheckStatus(); 
} 

public class MyService1 : HealthChecker, IMyService1 
{ 
    public override int CheckStatus() 
    { 
     // MyService1 implementation of CheckStatus() 
    } 

    // Implementation of IMyService1 operations 
    ..... 
} 

public class MyService2 : HealthChecker, IMyService2 
{ 
    public override int CheckStatus() 
    { 
     // MyService2 implementation of CheckStatus() 
    } 

    // Implementation of IMyService2 operations 
    ..... 
} 
+0

Я рад перепрофилировать и переделать. С удовольствием добавим операцию, которую можно подключить ко всем 100 услугам, которые у меня есть.Но не хотите идти и добавлять/обновлять все мои сервисы. – Angad

+0

@ пользователь1108205 посмотрите пожалуйста дополнение к моему отвечу. –

+0

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

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

  • Нет связанных вопросов^_^