【问题标题】:Issues with Migrating .Net Remoting from Framework 2 to 4将 .Net Remoting 从 Framework 2 迁移到 4 的问题
【发布时间】:2012-02-29 20:34:23
【问题描述】:

我目前有一个在 IIS 下的 Framework 2 上运行的 .Net 远程处理应用程序。我必须将它升级到 Framework 4 才能使用一些新组件。我已经能够在框架 2 上设置并顺利运行所有内容,但是一旦我更改为框架 4,当我尝试调用远程对象的函数之一时,就会出现以下异常。

The input stream is not a valid binary format. 
The starting contents (in bytes) are: 
53-79-73-74-65-6D-2E-52-75-6E-74-69-6D-65-2E-52-65 ...

这个错误不是真正的错误,它是由于远程对象抛出异常,而 IIS 将异常包装在 XML 中,这会引发 BinaryFormatter 关闭。 See this for more info on the bug.

这很不幸,因为我看不到导致异常的原因,并且之前从未使用过任何 Remoting,所以我对从哪里开始调试没有太多想法。似乎在进入代码之前就抛出了异常,因为我做了相当多的日志记录,但似乎都没有触发。

基本上,我正在从遇到类似问题的人那里寻找一些线索或指点:

  • 除了没有代码更改之外,还有什么可能导致异常 从 .Net 2 编译到 .Net 4?
  • 如何获取返回的完整异常消息?

这是获取远程对象的代码

Dim clientProvider As BinaryClientFormatterSinkProvider = New BinaryClientFormatterSinkProvider()
Dim serverProvider As BinaryServerFormatterSinkProvider = New BinaryServerFormatterSinkProvider()
serverProvider.TypeFilterLevel = System.Runtime.Serialization.Formatters.TypeFilterLevel.Full

tsChannelName = System.Guid.NewGuid().ToString()

Dim props As IDictionary = New Hashtable()
props("port") = 0
props("name") = tsChannelName
props("typeFilterLevel") = System.Runtime.Serialization.Formatters.TypeFilterLevel.Full
props("secure") = True
props("useDefaultCredentials") = True

Dim Channel As HttpChannel = New HttpChannel(props, clientProvider, serverProvider)

ChannelServices.RegisterChannel(Channel, False)

//Get the object on the Server
Dim rtnComm As I_CMQCComm = Activator.GetObject(GetType(I_CMQCComm), server)

//Knock knock
rtnComm.IsAlive() 'Exception is thrown here

我可以根据需要提供更多信息。

【问题讨论】:

  • 您是否还为 .Net 4 编译了客户端代码?
  • 是的!还将 IIS 更改为在 ASP.NET 4 上运行。通过将我的 Formatter 更改为 Soap,我设法看到了确切的错误。我刚刚设法解决了这个问题,我会发布一个答案:)

标签: c# .net vb.net remoting .net-remoting


【解决方案1】:

好的!

首先,要查看错误,建议更改使用的格式化程序,这样就可以看到整个错误。

基本上,我有一个服务器不可用,IIS 会发回 HTML,这会导致格式化程序丢失。

如何查看错误:

Dim clientProvider As SoapClientFormatterSinkProvider = New SoapClientFormatterSinkProvider()
Dim serverProvider As SoapServerFormatterSinkProvider = New SoapServerFormatterSinkProvider()

不要忘记更改 Web.Config 文件

<channels>
      <channel ref="http" >
         <serverProviders>
             <formatter ref="soap" />
          </serverProviders>
          <clientProviders>
             <formatter ref="soap" />
           </clientProviders>
      </channel>
</channels>

服务器不可用是由于 IIS 中的错误。错误记录在事件查看器中的应用程序下(控制面板 -> 管理工具 -> 事件查看器)。

我的错误是由于我已将 Machine.config 文件更改为 IIS 无法在用户 ASP_NET 下运行。然而我不知道的是每个框架都有一个文件。由于我禁用了用户 ASP_NET,IIS 根本没有用户启动 aspnet_wp.exe 进程。

小错误,希望这可以帮助一些人调试他们的 .Net Remoting。 它在 .Net 4 下完美运行!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-12-13
    • 2014-02-13
    • 1970-01-01
    • 2018-11-05
    • 2022-08-12
    • 1970-01-01
    • 2011-02-13
    • 1970-01-01
    相关资源
    最近更新 更多