2010-01-20 3 views
0

여기 읽었습니다 : 나는 비슷한 문제로 생각했던 데 Error 10048 when trying to open TcpChannelTcpChannel을 등록 문제

- 분명히 없습니다. 나는 윈속을 다시 처음 respondant의 조언을했다 어쨌든, 여기 내 채널 등록 비용 (윈속이 어쨌든, 손상받을 않습니다 어떻게?) :

channel = new TcpChannel(channelPort); 
ChannelServices.RegisterChannel(channel, false); 

와 클라이언트 전화 :

// Create a channel for communicating w/ the remote object 
// Notice no port is specified on the client 
TcpChannel channel = new TcpChannel(); 
ChannelServices.RegisterChannel(channel, false); 

// Create an instance of the remote object 
CommonDataObject obj = Activator.GetObject(typeof(CommonDataObject) , 
    "tcp://localhost:49500/CommonDataObject") as CommonDataObject; 

이 사용하기에 너무 번거 롭다. 그러나이 문제는 서버의 ChannelServices.RegisterChannel (...)에있는 것으로 보입니다. 이제 클라이언트 부분을 포함시킨 이유는 클라이언트 인스턴스가 서버 객체를 확인하기 때문입니다. 찾지 못하면 서버를 인스턴스로 '밀어 넣기'합니다. 내가 궁금한 것은 객체의 사용 가능한 첫 번째 (Activator.GetObject (...))를 확인하면이 TCP 채널이 이미 등록되었다고 생각하는 ChannelServices가 발생합니다. 그것은 바보라고 들리지만, 그것은 나의 유일한 가능한 설명입니다. 방화벽, 곰팡이 방지 앱을 사용 중지하고 재부팅했습니다. 여전히 수신이

채널 'tcp'는 이미 입니다.

나는 나의 스택 추적을 보았고, 통지 한 다음 RegisterChannelInternal (...)가 '이미 등록을 한'문제의 원인이 무엇있을 경우

at System.Runtime.Remoting.Channels.ChannelServices.RegisterChannelInternal(IChannel chnl, Boolean ensureSecurity) 
    at System.Runtime.Remoting.Channels.ChannelServices.RegisterChannel(IChannel chnl, Boolean ensureSecurity) 

내가 궁금. 그래서, 그 외에는 손실이 있습니다 ...

해당 채널을 확인하는 호출이 원인 일 수 있습니다. 그것이 합의라면 다음 질문으로 변경됩니다. 채널에 대해 설문 조사를하려면 어떻게해야합니까?

업데이트 : 클라이언트에서 서버의 초기 검사를 제거하고 서버를 인스턴스화해야한다고 가정하면 클라이언트 검사가 문제를 일으키는 것으로 나타났습니다. 나는 서버를 관리 할 수 ​​있었고 클라이언트는 '투명한 프록시'객체를 얻었습니다. 그러나 문제는 여전히 남아 있습니다. "서버가 인스턴스화되었는지 검색하려면 어떻게합니까?"

답변

0

대답은 분명히 예입니다 ... 클라이언트가 채널을 등록 할 때 서버가 다른 Tcp 채널을 등록하지 못하게합니다. 나는 Tcp 채널의 인스 턴싱과 등록을 제거했다.

ping에 대한 답변을 얻지 못했기 때문에 obj = Activator.GetObject (...)에서 try/catch 블록을 사용하고 있습니다. obj가 null로 반환되면 서버를 미묘하게 움직이며 화재가 발생하고 클라이언트가 CommonDataObject (MarshalByRefObject에서 파생 됨)와 연결됩니다.

그래서 어떤 의미에서는 내가 사용하고있는 폴링 기술입니다. 좀 더 우아한 것을 원합니다. 즉, 실패를 유발하여 작동하지 않는 구현입니다. 나에게 해킹은 해결 방법보다 더 많은 일이다.

나는 대답을 찾았습니다 here. 부주의 한 솔루션에 대한 Abhijeet에게 감사드립니다 !!! Btw ... 신고하는 것을 잊지 마세요 :

using System.Linq;