Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 努力覆盖System.ServiceModel.ClientBase<;T>;。CreateChannel()_C#_Wcf_Xamarin.ios - Fatal编程技术网

C# 努力覆盖System.ServiceModel.ClientBase<;T>;。CreateChannel()

C# 努力覆盖System.ServiceModel.ClientBase<;T>;。CreateChannel(),c#,wcf,xamarin.ios,C#,Wcf,Xamarin.ios,在为通过HTTP公开的简单WCF服务实现MonoTouch客户端时,我得到了以下InvalidOperationException MonoTouch不支持动态代理代码生成。重写此方法或其调用方以返回特定的客户端代理实例 这是第141行的 因此,我需要使用一个不使用动态代码生成的实现,在我自己的ClientBase子类中重写System.ServiceModel.ClientBase上的方法CreateChannel()。该方法返回T的实例 如果我返回我的服务客户端的新实例,System.Ser

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

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

这是第141行的

因此,我需要使用一个不使用动态代码生成的实现,在我自己的ClientBase子类中重写
System.ServiceModel.ClientBase
上的方法
CreateChannel()
。该方法返回
T
的实例

如果我返回我的服务客户端的新实例,
System.ServiceModel.ClientBase
会在
InnerChannel
的getter上抛出异常
无法将类型为“MyServiceClient”的对象强制转换为类型为“System.ServiceModel.IClientChannel”


我不清楚如何从这一点出发-任何指针都值得赞赏。

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


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

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


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

这是一个非常简单的接口-因此我刚刚基于System.Net.WebClient编写了一个简单的客户端,这是一个非常简单的界面,所以我刚刚基于System.Net.WebClient编写了一个简单的客户端,它工作得非常好,大约有10行代码。

如果您需要更多帮助,请发布对
CreateChannel()
实现IClientChannel的覆盖看起来像是一场噩梦。我已经转向创建一个2.0风格的Web参考,让我们看看我们从那里走到哪里。你通常不会创建自己的频道(除非你正在做一些WCF不支持的非常具体的事情)。您应该只构建WCF库已经提供的通道-通道类型和配置的选择是困难的部分。如果您需要更多帮助,请发布您对
CreateChannel()
实现IClientChannel的覆盖看起来像一场噩梦。我已经转向创建一个2.0风格的Web参考,让我们看看我们从那里走到哪里。你通常不会创建自己的频道(除非你正在做一些WCF不支持的非常具体的事情)。您应该只构建WCF库已经提供的通道-通道类型和配置的选择是困难的部分。我也有同样的问题,您能提供示例代码来解决这个问题吗?谢谢。只需为该服务构建一个非常简单的桌面客户端,启动Wireshark来查看在线上发生了什么,然后使用简单的代码以简单的方式使用WebClient()复制它。然后将此代码隐藏在MonoTouch解决方案中的某个位置,当您最终在MonoTouch上正常运行此代码时,请使用正确的实现替换基于WebClient的实现。我也有同样的问题,您能否提供示例代码来解决此问题?谢谢。只需为该服务构建一个非常简单的桌面客户端,启动Wireshark来查看在线上发生了什么,然后使用简单的代码以简单的方式使用WebClient()复制它。然后将此代码隐藏在MonoTouch解决方案中的某个地方,当您最终在MonoTouch上正常运行此代码时,请使用正确的实现替换基于WebClient的实现。