Monotouch和WCF: SVCUTIL.EXE和SLSVCUTIL.EXE的区别以及如何避免不支持的通用Chann

本文关键字:EXE 不支持 何避免 Chann 区别 WCF SVCUTIL SLSVCUTIL Monotouch | 更新日期: 2023-09-27 18:15:51

我(再次并且仍然)尝试在Monotouch中使用一些WCF服务。第一种方法:在Monodevelop中添加web引用失败。无法创建引用文件。然后我尝试SVCUTIL.EXE并得到一个错误,即通用ChannelFactory在Monotouch中不可用-我想是因为没有可用的反射。

接下来,我尝试了Silverlight 3 SDK中的SLSVCUTIL.EXE。这会为不同于通过SVCUTIL.EXE创建的服务生成名称空间。因为我已经有很多包装器代码,所以我必须更改很多。

出现了以下问题:

  • 我可以重写CreateChannel方法并为每个服务返回专用通道,而不是依赖于不存在的通用版本,正如抛出的异常所建议的那样?这意味着修复由SVCUTIL.EXE生成的代码。
  • 如何在重写方法中创建通道?我只有服务的接口。我谷歌了一下,找不到任何例子。需要在这个方法中编写的代码是什么样的?
  • 我完全不清楚:这两个服务工具之间有什么区别?
  • 如果我把命名空间问题整理出来,通过Silverlight实用程序创建的存根是否会使我的项目工作,或者也会受到通用通道问题的影响?
  • 为什么Silverlight工具可以在不动态发送代码的情况下工作?输出的代码有什么不同?动态版本有什么优势?
  • 在MT中支持哪个版本的Silverlight。我可以使用v4的工具还是必须是版本3?
  • MT中的WCF是否支持流媒体,比如下载大文件?

Monotouch和WCF: SVCUTIL.EXE和SLSVCUTIL.EXE的区别以及如何避免不支持的通用Chann

WCF是一个巨大的野兽,很难给出一般的答案,太多的取决于细节。一般规则是MonoTouch支持与Silverlight一起发布的WCF相同的子集(即使随着时间的推移添加了一些内容)。

我想是因为没有反射。

反射是可用的,并与MonoTouch工作。反射。Emit不会,因为苹果不允许在iOS设备上使用JIT代码。这可以限制一些需要在运行时生成代码的API(但如果代码生成可以在编译时完成,则不是问题)。

…这意味着修复由SVCUTIL.EXE生成的代码. ...

战斗/编辑生成的代码通常是一个坏主意(例如,将来的维护)。我建议您在投入太多时间定制生成的代码之前尝试使用slsvcutil.exe

…需要在这个方法中编写的代码是什么样的?

Mono系统的完整源代码。如果您希望提供自己的通道(或自定义生成的代码),可以使用ServiceModel和System.ServiceModel.Web。

我完全不清楚:这两个服务工具之间有什么区别?

SL前缀,在slsvcutil.exe中,用于Silverlight。微软制作了这个工具来生成只使用Silverlight中可用的WCF子集的代码。因为这是MonoTouch支持的相同子集,所以这是最好的工具。

如果我把命名空间问题整理出来,通过Silverlight实用程序创建的存根是否会使我的项目工作,或者也会受到通用通道问题的影响?

应该工作。这就是今天人们在MonoTouch中使用WCF(可用子集)的方式。如果这个(子集/工具)有问题,你可以填写一个关于它的bug报告(用一个测试用例),我们会看一看。