【问题标题】:Struggling to override System.ServiceModel.ClientBase<T>.CreateChannel()努力覆盖 System.ServiceModel.ClientBase<T>.CreateChannel()
【发布时间】:2012-01-29 20:16:24
【问题描述】:

我在为通过 HTTP 公开的简单 WCF 服务实现 MonoTouch 客户端时收到以下 InvalidOperationException

MonoTouch 不支持动态代理代码生成。重写此方法或其调用者以返回特定的客户端代理实例。

来自this file 的第 141 行。

所以我需要在我自己的 ClientBase 子类中使用不使用动态代码生成的实现来覆盖 System.ServiceModel.ClientBase&lt;T&gt; 上的方法 CreateChannel()。该方法返回一个T 的实例。

如果我返回服务客户端的新实例,System.ServiceModel.ClientBase&lt;T&gt; 会在 InnerChannel 的 getter 上抛出异常 Unable to cast object of type 'MyServiceClient' to type 'System.ServiceModel.IClientChannel'

我不知道如何从这一点开始 - 任何指针表示赞赏。

【问题讨论】:

    标签: c# wcf xamarin.ios


    【解决方案1】:

    从源代码看来,框架无法通过反射创建频道的新实例,因此需要您自己重写该方法。

    WCF 基础结构的大部分内容并不明显,主要是因为它不寻常地使用了泛型(只有在您经历过管道和返回之后才有意义)。在这种情况下,CreateChannel() 返回的频道 必须IClientChannel(因为您在会话的客户端)。确保您的频道上存在此界面,并且您的错误应该消失(可能会被另一个问题取代)。

    【讨论】:

    • 如果您需要更多帮助,请发布您对CreateChannel()的覆盖
    • 实现 IClientChannel 看起来像一场噩梦。我已经切换到创建 2.0 样式的 Web 参考,让我们看看从那里开始。
    • 您通常不会创建自己的频道(除非您正在做一些 WCF 不支持的非常具体的事情)。您应该只构建 WCF 库已经提供的通道 - 选择通道的类型和配置是困难的部分。
    【解决方案2】:

    这是一个非常简单的界面——所以我只是基于 System.Net.WebClient 编写了一个简单的客户端,它运行良好,大约 10 行代码。

    【讨论】:

    • 我有同样的问题,你能提供示例代码来解决这个问题吗?谢谢。
    • 只需为该服务构建一个非常简单的桌面客户端,启动 Wireshark 以查看网络上发生的情况,然后使用简单的代码以简单的方式使用 WebClient (msdn.microsoft.com/en-us/library/…) 复制它。然后将此代码隐藏在您的 MonoTouch 解决方案中的某个位置,当您最终让这些东西在 MonoTouch 上正常工作时,将基于 WebClient 的实现替换为正确的实现。
    猜你喜欢
    • 2013-04-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-12
    • 2015-11-13
    • 2015-12-27
    相关资源
    最近更新 更多