2011-08-17 3 views
2

.NET Remoting 통신을 사용하는 클라이언트 - 서버 응용 프로그램이 있습니다. 인증을 이유로 HTTP 요청에 세션 쿠키를 삽입하기 위해 사용자 정의 IClientChannelSink을 작성해야했습니다. 서버 쪽에서 나는 서버가 HTTP 요청 헤더에서 필요로하는 정보를 읽기 위해 사용자 정의 IServerChannelSink을 작성했다.사용자 지정 .NET Remoting IServerChannelSink

클라이언트 쪽은 잘 작동하지만 서버 측에서 난 항상 다음과 같은 오류 얻을 다음과 같이

System.ArgumentNullException was unhandled by user code Message=No message was deserialized prior to calling the DispatchChannelSink. Parameter name: requestMsg Source=mscorlib ParamName=requestMsg
StackTrace: at System.Runtime.Remoting.Channels.DispatchChannelSink.ProcessMessage(IServerChannelSinkStack sinkStack, IMessage requestMsg, ITransportHeaders requestHeaders, Stream requestStream, IMessage& responseMsg, ITransportHeaders& responseHeaders, Stream& responseStream) at MyAuthentication.MyServerChannelSink.ProcessMessage(IServerChannelSinkStack sinkStack, IMessage requestMsg, ITransportHeaders requestHeaders, Stream requestStream, IMessage& responseMsg, ITransportHeaders& responseHeaders, Stream& responseStream) in C:\Dev\MyAuthentication\MyServerChannelSink.cs:line 82 at System.Runtime.Remoting.Channels.BinaryServerFormatterSink.ProcessMessage(IServerChannelSinkStack sinkStack, IMessage requestMsg, ITransportHeaders requestHeaders, Stream requestStream, IMessage& responseMsg, ITransportHeaders& responseHeaders, Stream& responseStream) at System.Runtime.Remoting.Channels.Http.HttpServerTransportSink.ServiceRequest(Object state) at System.Runtime.Remoting.Channels.SocketHandler.ProcessRequestNow()
InnerException:

내 "processMessage를"-methodlooks을 :

public ServerProcessing ProcessMessage(IServerChannelSinkStack sinkStack, IMessage requestMsg, ITransportHeaders requestHeaders, Stream requestStream, out IMessage responseMsg, out ITransportHeaders responseHeaders, out Stream responseStream) 
{ 
    // Pre-processing before sending the message to the next sink in the chain 
    object state = null; 
    ProcessRequest(requestMsg, requestHeaders, ref requestStream, ref state); 

    /* Call the next sink in the chain */ 
    sinkStack.Push(this, state); 
    ServerProcessing serverProcessing = this.NextChannelSink.ProcessMessage(sinkStack, requestMsg, requestHeaders, requestStream, out responseMsg, out responseHeaders, out responseStream); 

    // Processing from sink further in the chain has completed. Now do any post-processing before returning to the previous sink in the chain. 
    ProcessResponse(null, responseHeaders, ref responseStream, state); 

    return serverProcessing; 
} 

사람 있으면 좋은 것 뭐가 잘못 됐는지 말해 줄 수있어.

답변

0

문제를 해결했습니다. 직렬화를 수행하기 위해 채널 싱크를 사용하지 않기 때문에 나 자신도 메시지의 역 직렬화를 처리하고 싶지는 않습니다. 다음 실현하는 것이 잘 작동합니다 :

public ServerProcessing ProcessMessage(IServerChannelSinkStack sinkStack, IMessage requestMsg, ITransportHeaders requestHeaders, Stream requestStream, out IMessage responseMsg, out ITransportHeaders responseHeaders, out Stream responseStream) 
{ 
    // Pre-processing before sending the message to the next sink in the chain 
    object state = null; 
    ProcessRequest(requestMsg, requestHeaders, ref requestStream, ref state); 

    ServerProcessing serverProcessing; 
    if (requestMsg != null) 
    { 
     /* Call the next sink in the chain */ 
     sinkStack.Push(this, state); 
     serverProcessing = this.NextChannelSink.ProcessMessage(sinkStack, requestMsg, requestHeaders, requestStream, out responseMsg, out responseHeaders, out responseStream); 
     sinkStack.Pop(this); 
    } 
    else 
    { 
     responseMsg = null; 
     responseHeaders = null; 
     responseStream = null; 
     serverProcessing = ServerProcessing.Complete; 
    } 

    // Processing from sink further in the chain has completed. Now do any post-processing before returning to the previous sink in the chain. 
    ProcessResponse(null, responseHeaders, ref responseStream, state); 

    return serverProcessing; 
} 
2

특정 상황에서 requestMsg 매개 변수는 null 일 수 있습니다. 그래서 그 사건을 처리해야합니다. 예를 들어 다른 서버 채널 싱크 이 requestMsg를 null로 설정하여 ProcessMessage 함수를 호출하고 있습니다.

편집 : 샘플 링크가 제공됩니다. 다음은 서버 싱크 샘플에 ​​대한 링크입니다. Server Sink

+0

이러한 사례를 처리하는 방법에 대한 샘플 코드가 있습니까? 웹에서 IClientChannelSink에 대한 참조 구현을 찾을 수 없습니다. 내 IClientChannelSink 구현은 HTTP 헤더에서 일부 값을 읽지 만 요청 메시지는 변경하지 않아야합니다. – Alexander

+0

MSDN에는 샘플 구현이 있습니다. 하지만 그것은 내 구현과 비슷한 것으로 보인다 http://msdn.microsoft.com/en-us/library/system.runtime.remoting.channels.iserverchannelsink(v=VS.80).aspx – Alexander

0

을 당신은 oServerSinkProvider = null를 설정하고 시스템이 기본 싱크 공급자를 지원하는 서버 채널

TcpServerChannel oTcpChannel = 
    new TcpServerChannel(oTcpChannelConfiguration, oServerSinkProvider, oAuthority); 

을 만들면. TCP 채널의 경우 비누 포맷터 또는 http 채널의 경우 바이너리 포맷터 인 SoapServerFormatterSinkProvider 또는 BinaryServerFormatterSinkProvider과 같은 고유 포맷터를 지정할 수 있습니다.

그러나 자신의 서버 싱크대를 지원하는 경우에도 자체 포맷터를 구현해야합니다.

set 
    { 
    if (value != null) 
    { 
     nextProvider = new BinaryServerFormatterSinkProvider(); 
     nextProvider.Next = value; 
    } 
    else 
    { 
     nextProvider = value; 
    }; 
    } 

그런 다음 다음 공급자가이 경우에 fomatting, 바이너리 형식의 작업을 수행합니다 다음과 같은 방법으로 함수 IServerChannelSinkProvider.Next의 사용자 설정 섹션에서 수행 할 수 있습니다.