簡體   English   中英

在.Net Remoting中,“。NET Remoting框架”到底是什么?

[英]In .Net Remoting, what or where specifically is the “.NET Remoting Framework”?

tl; dr:

我試圖找到.Net Remoting Framework的運行位置(例如,服務名稱或進程名稱)。 此外,來源將是驚人的。

內容:

我正在維護使用.Net遠程處理的舊代碼,以允許使用存儲兩個進程之間的連接信息的對象,並且長期以來一直存在隨機斷開連接的問題,並且顯然由於那些遠程處理對象超時而導致崩潰。 這篇文章的答案中提到了我們所看到的問題,特別是一點點:

我的問題是使用元帥注冊遠程對象。 隨着時間的流逝,遠程對象將消失以供客戶端使用,即不再在遠程對象上使用。

我們在過去使用的“修復”方法就是該文章中提到的:返回一個空的租約管理器,該管理器可以使對象永遠存活,以避免隨機的不必要的超時。

幾年前,該代碼被刪除是因為它在Linux上引起了問題-基本上,每個連接在有用后仍處於活動狀態會消耗一個套接字,並且由於套接字是Linux上的文件,因此我們用完了文件描述符。 由於我們認為不建議使用最受影響的超時問題的功能,因此我們恢復了定期超時,並且一切正常,已經有兩年了。

但是,最近,最近對Windows的補丁程序或其他一些環境變化似乎已經導致不必要的超時問題在我們的某些計算機上重新發揮了作用(僅在Windows上; Mono似乎可以很好地處理此工作流程,這給了我強大的支持。預感這是一個.NET錯誤)。 具體來說,每當我們嘗試在另一個客戶端保持連接約5小時或更長時間之后嘗試連接新客戶端時,該過程就會掛起,嘗試連接到TCP端口,如果我理解正確的話,這就是Remoting Framework告訴我們的內容是我們的服務器正在監聽的位置。

由於這嚴重損害了我們的Windows使用率,導致該缺陷最終得到了正確解決的推動力,而我現在想找出的是為什么在經過一個客戶端約5小時的持續連接后,我們不再能夠從新的客戶端進程到服務器建立遠程連接。 但是首先,為了做到這一點,我想了解整個工作流程,包括了解.Net Remoting Framework中正在發生的事情,該框架存儲了首先要創建的遠程連接所需的信息。 但是,我所讀的所有內容只是在順便提及了框架,而沒有解釋其確切含義。

題:

關於.Net遠程處理的許多 不同 (PDF警告) 文章都將“ .Net Remoting框架”稱為存儲有關通過RemotingServices.MarshalRemotingServices.RegisterWellKnownSericeType注冊的對象的信息的關鍵部分。 如果我理解正確,那么它將允許其他客戶端.Net進程使用兩個進程都稱為鍵的URI向其查詢那些對象。

在哪里查詢此過程或服務? 老實說,即使答案是我在文檔中明確提到的某種漏掉的東西,我也會為得到它而欣喜若狂。 謝謝!

(當然,對我的更大問題的任何其他見解也將不勝感激。)

編輯 :“更大的問題”似乎是我們正在運行的安全軟件程序正在干擾我們工作計算機中的網絡適配器,有時會導致在我們的遠程處理程序嘗試通過那些套接字進行連接期間發生System.Net.Sockets.SocketExceptions 。 這意味着,當LeaseManager檢查Lease是否仍在為RemotingObject工作時,它會看到套接字錯誤,並反身認為Lease已斷開連接,因此刪除了我們想要保留的對象引用。 我們的方法是將InitializeLifetimeService函數返回為null,並使用Dispose模式自己處理所有對象垃圾回收。 完整描述在這里。

它可以在定義了主機的應用程序的任何位置運行 配置部分,可以是IIS,Windows服務或控制台應用程序。 客戶端應用程序也將需要進行一些配置,以告知該類確實是遠程主機的代理。

遠程處理中使用的類型在Sytem.Runtime.Remoting命名空間中。

我從來沒有使用過將對象代理保持活動數小時的遠程處理。 我想您通常會想要重新使用它,然后丟棄它。 如果那不可能,請檢查模式。 SingleCall可能是最好的選擇,因為在主機端會為每個遠程請求創建一個新對象,並在完成后銷毀該對象。 如果編碼不正確,則壽命較長的對象可能會處於一些過時的狀態,或者存在內存泄漏或其他問題。

對於ClickOnce智能客戶端,我們仍然也使用遠程處理,並且沒有遇到超時問題,但是我們的遠程處理僅配置為SingleCall。

通過鏈接,這將是托管應用程序中的配置:

<configuration>
  <system.runtime.remoting>
    <application>
      <service>
        <wellknown mode="SingleCall" type="Hello.HelloService, Hello" 
objectUri="HelloService.soap" />
      </service>
    </application>
  </system.runtime.remoting>
</configuration>

而在客戶端上:

<configuration>
  <system.runtime.remoting>
    <application>
      <client>
        <wellknown type="Hello.HelloService, Hello" 
url="http://localhost:8000/HelloService.soap" />
      </client>
    </application>
  </system.runtime.remoting>
</configuration>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM