2012-02-06 46 views
0

我使用XML-RPC.NET(從http://www.xml-rpc.net/)和HttpListener方法在特定網絡端口上偵聽XML-RPC通信並對其進行響應。讀取Stream對象而不使用它

附帶在請求的主體是通過HttpListenerContextInstance.Request.InputStream流對象可訪問:

HttpListener hlListener = new HttpListener(); 
HttpListenerContext hlcContext = hlListener.GetContext(); 
// hlcContext.Request.InputStream contains what I want 

的流可以從hlcContext.Request.InputStream被訪問但該流處於不可搜索,所以我不能讀取它/顯示它然後回溯到它的開頭,以便XML-RPC.NET庫可以根據需要使用它。一旦它被讀取,它就會被使用並且不能被重新讀取。

我知道處理這種情況的一種方法是將其從Stream轉換爲支持尋找的MemoryStream,但是,我不知道如何執行此操作以便XML-RPC.NET繼續使用MemoryStream而不是Stream。僅僅複製流至一個MemoryStream似乎消耗流使其無法使用過去的這一點:

// hlcContext.Request.InputStream is currently filled 
MemoryStream msInput = new MemoryStream(); 
hlcContext.Request.InputStream.CopyTo(msInput); 
byte[] byteInput = msInput.ToArray(); 
// hlcContext.Request.InputStream is now empty and XML-RPC.NET can no longer use it :(

我怎樣才能從流中讀取,這樣我可以將其存儲在一個字符串,並有流繼續工作之後的XML-RPC.NET?

+0

如何你是否將流提供給XML-RPC.NET?我沒有看到你的示例代碼。 – 2012-02-06 17:22:14

+0

流是由XML-RPC.NET庫以某種方式/某處訪問網站時(http:// localhost/DoSomething)創建的。 – Coder6841 2012-02-06 17:31:15

+0

我沒有時間仔細查看代碼,但假設'HttpListener'是一個XML RPC類型,那麼您可以對其進行子類化並更改'GetContext()'的實現方式以注入所需的行爲。 – 2012-02-06 17:34:53

回答

1

如果你不能找到一個合法的方式,這裏是一個黑客到流設置爲Request.InputStream(作爲最後的手段)

MemoryStream msInput = new MemoryStream(); 
hlcContext.Request.InputStream.CopyTo(msInput); 
byte[] byteInput = msInput.ToArray(); 
msInput.Seek(0, SeekOrigin.Begin); 

request.GetType().InvokeMember("m_RequestStream", BindingFlags.SetField | BindingFlags.Instance | BindingFlags.NonPublic, null, request, new object[] { msInput }); 

現在,您可以自由使用byteInput

+0

這段代碼是什麼使它成爲黑客/最後的手段?它會引入不穩定性嗎?該應用程序是一個關鍵的商業應用程序,所以如果這可能會導致無法預料的問題,那麼最好不要使用它。 – Coder6841 2012-02-16 19:29:43

+0

@ Coder6841,我不認爲會有不穩定。通過使用這段代碼,你可以訪問'request'對象的私有變量('m_RequestStream')。如果MS希望你這樣做,它會標記爲公開。這意味着它可能會在下一個版本中發生變化。網絡框架(儘管我在過去的版本中沒有看到任何變化) – 2012-02-16 20:24:10

+0

這很好,謝謝! – Coder6841 2012-02-17 19:31:46

0

這應該與支持搜索的流(CanSeek == true)一起使用。

MemoryStream msInput = new MemoryStream(); 
var preCopyPosition = hlcContext.Request.InputStream.Position; 

hlcContext.Request.InputStream.CopyTo(msInput); 
byte[] byteInput = msInput.ToArray(); 

// Go back to pre-copy state 
hlcContext.Request.InputStream.Position = preCopyPosition; 
+0

不幸的是,該流不支持尋求。 「hlcContext.Request.InputStream.Position = preCopyPosition;」只會給一個不受支持的例外。 – Coder6841 2012-02-06 17:33:31

+2

好的。我會留下來防止複製。 – 2012-02-06 17:42:21

相關問題