2011-08-17 85 views
2

我有一個使用.NET Remoting通信的客戶端服務器應用程序。出於身份驗證的原因,我必須編寫自定義IClientChannelSink以將會話cookie插入到HTTP請求中。 在服務器端,我還寫了一個自定義IServerChannelSink以從HTTP請求標頭中讀取服務器需要的一些信息。自定義.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

我解決了我的問題。由於我不使用通道接收器做任何序列化,我也不想自己處理消息反序列化。下面的FPGA實現正常工作:

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。所以你必須處理這些情況。例如,另一個服務器通道接收器 正在調用ProcessMessage函數,並將requestMsg設置爲null!

編輯:提供的鏈接到示例。 以下是服務器接收器示例的鏈接:Server Sink

+0

你有任何示例代碼如何處理這些情況?我找不到Web中IClientChannelSink的任何參考實現。我的IClientChannelSink實現應該只能從HTTP頭中讀取一些值,但不能以任何方式改變請求消息。 – Alexander

+0

在MSDN中有一個示例實現。但它似乎與我的實現類似http://msdn.microsoft.com/en-us/library/system.runtime.remoting.channels.iserverchannelsink(v=VS.80).aspx – Alexander

0

通過創建服務器頻道

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

您可以設置oServerSinkProvider = null,系統將支持默認接收器提供。您也可以指定您自己的格式化程序,例如TCP通道的soap格式化程序或http通道的二進制格式化程序:SoapServerFormatterSinkProviderBinaryServerFormatterSinkProvider

但是,如果您支持您自己的服務器接收器,則您也必須實現您自己的格式器。

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

那麼接下來的提供者fomatting,二進制格式的工作在這種情況下:您可以通過在你的函數IServerChannelSinkProvider.Next您設定的部分進行。