2011-09-16 6 views
2

C#에서 Remoting을 사용하여 다른 서버에 연결하고 있습니다. 클라이언트 측에서 지속적으로 기능을 추가하고 있기 때문에 서버 측의 서비스가 항상 최신 상태는 아닙니다.C# VS 버전 관리의 리모콘

인터페이스에서 메서드를 호출하면 (서버에서 메서드를 원격으로 호출 함) 서버 측 구현에이 메서드가 존재하지 않는다는 것을 어떻게 해결할 수 있습니까?

잡을 수없는 예외가 있기 때문에 클라이언트가 자연스럽게 충돌합니다. 예, 할 수 있습니다. 그러나이 방법으로 호출하는 여러 가지 메서드가 있기 때문에 각각에 대해 예외 처리를 추가하는 것은 힘들 것입니다.

"해결책"중 하나는 내 MarshalByRefObject에있는 각 메서드에 사용자 지정 버전 특성을 넣는 것이 었습니다. 그러나 각 방법을 호출 할 때 이후에이를 사용하는 방법을 모르겠습니다. 각 메소드에 주석/속성을 추가해도 괜찮지 만, 버전이 새롭는지 여부를 묻는 문이 if 인 경우에는 다시 고통 스러울 것입니다.

내가 생각한 또 다른 방법은 상속을 사용하는 것이 었습니다.

public abstract class AbstractServer1 : MarshalByRefObject 
{ 
    public abstract void feature1(); 
} 

public abstract class AbstractServer2 : AbstractServer1 
{ 
    public abstract featureInVersion2(); 
    public abstract string reallyNewFeature(); 
} 

public class ServerClass1 : AbstractServer1 
{ 
    public void feature1(); 
} 

public class ServerClass2 : ServerClass1, AbstractServer2 
{ 
    public void featureInVersion2(); 
    public string reallyNewFeature(); 
} 

하지만이 같은 결과 것 :

public AbstractServer getRemoteObject(string host, int port) 
{ 
    object obj = Activator.GetObject(typeof(AbstractServer2), "tcp://" + host + ":" + port.ToString() + "/ServiceName"); 
    if (typeof(obj) == ServerClass1) 
    { 
     ... 
    } 
} 

그리고이없는 둘 아름다운도 정말 작동합니까.

좋은 해결책이 있습니까?

참고 : 서버 및 클라이언트에서 동일한 어셈블리 파일을 사용하는 것은 불행히도 옵션이 아닙니다.

도움을 주시면 감사하겠습니다.

+2

는 당신이 원격을 알고 계십니까 (이 결여 된 행동을 반환하지 않습니다 같은 오류에 대한 예외를 rethrowing 및 널 (null) -if 기능을 반환하지 않습니다) 당신이 원하는 행동의 종류가이 클래스 비트를 다시 작성할 수 WCF에 찬성하여 더 이상 사용되지 않을 예정입니까? 이후 .NET 3.0? –

+0

@ 존 : 빠른 답장을 보내 주셔서 감사합니다. 흠 아니, 나는하지 않았다 : P 오케이 ... MSDN (http://msdn.microsoft.com/en-us/library/ms734712.aspx)의 튜토리얼을 살펴보고, 완전히 틀렸어. 내 문제는 WCF에서도 마찬가지다. 내가 놓친 게 있니? – Atmocreations

+0

클라이언트 측 또는 서버 측 예외입니까? 예외가 어셈블리 해결 오류를 포함합니까? – Seb

답변

1

서버 측에없는 함수를 호출 할 때 어떤 종류의 동작이 필요합니까?

This code might be usefull to you

그것은 특정 인터페이스를 구현하는 오브젝트의 멤버를 호출 할 때마다 발생 예외를 캐치 프록시를 만든다. wpf 채널이나 Remoting 프록시의 인터페이스 멤버에서 사용할 수 있습니다.

IMyInterface myService = [...]; 
IMyInterface myExceptionLoggedService = ExceptionProxyGenerator.Generate<IMyInterface>(myService); 
(myExceptionLoggedService as IExceptionProxy).Error+=(sender,method,exception)=>{ 
    // do what you want on exception 
}; 
// Use my service : 
myExceptionLoggedService.MyExistingFunction();// ok 
myExceptionLoggedService.MyNotExistingFunction();// calling the above delegate 

당신은

관련 문제