【问题标题】:Is there any good material about the working mechanism of IIS hosting WCF web service?IIS托管WCF web服务的工作机制有什么好的资料吗?
【发布时间】:2010-12-28 15:24:38
【问题描述】:

我将一些文件放在我网站的 Bin 文件夹中并放置一个 svc 文件以指向一些指向我的服务类型的程序集,这真是太神奇了。然后,我可以像这样神奇地将服务引用添加到 url:

http://www.myserver.com//xxx.svc

我真的很想知道从我点击“添加服务引用”到代理发生了什么是如何正确生成的。 IIS 在此期间做了什么?

【问题讨论】:

    标签: wcf web-services iis iis-7


    【解决方案1】:

    这不是真正的魔法 - 它是元数据交换! :-)

    当您在 Visual Studio 中执行 Add Service Reference 时,会在后台询问 svc 文件指定的服务端点以获取其元数据。这基本上类似于 WSDL(Web 服务描述语言)文件 - 对您的服务、其方法、他们期望的参数等的机器可读描述 - 以及 XSD(XML 模式) - 再次以机器可读形式 -定义使用的参数类型。

    基于这两条信息,WCF 客户端导入可以创建 C# 或 VB.NET 类

    • 在服务端镜像确切的服务实现 - 相同的方法名称、相同的预期和返回参数
    • 创建必要的数据类 - 再次使用 C# 或 VB.NET - 基于 XML 模式文件

    所以最后 - 这真的不是魔法。这是自描述服务和读取元数据并根据元数据描述创建客户端代理类的代码生成的美妙之处

    如果您对有关元数据的更多详细信息感兴趣,请阅读MSDN docs on WCF metadata - 相当广泛和深入。

    【讨论】:

    • 我注意到我可以将大量编译后的服务程序集放在 Bin 文件夹中,并添加相当多的 svc 文件来公开这些程序集中包含的服务类型。问题是,对于每一个 svc 文件,要通过所有的程序集反映来定位对应的服务类型,需要花费很大的精力。除了反射之外,我想不出其他方法来做到这一点。但是反射成本不是太高了吗?
    • @smikipedia:一个 svc 文件确切地知道它需要什么 ServiceHost 或 ServiceHostFactory;这可以通过检查程序集来评估一次,然后您就可以获得该信息。一旦 WCF 运行时知道每个 svc 文件需要哪个程序集,就不再涉及反射或其他耗时的评估......所以我想这可能是一个启动成本,但应该不会太糟糕
    • 请注意,IIS 几乎与此无关。
    • @John Saunders:是的——确实是 WCF 运行时组件完成了所有繁重的工作; IIS 仅用于在第一个请求进入时实例化 ServiceHostServiceHostFactory
    【解决方案2】:

    正如 marc_s 所述,“添加服务引用”按钮运行一个从服务收集元数据并从中生成客户端代码的工具。

    我只是想补充一点,如果您想自己查看元数据 (WSDL),您只需将“?wsdl”添加到您的 URL:

    http://localhost/MyService.svc?wsdl
    

    一个 WSDL 文档将链接到许多其他文档,因此您必须发出多个请求来挖掘它们,但看看数据类型和合同是如何传输的很有趣。

    此外,如果您想防止其他人自动为您的服务生成客户端,您可以通过从 WCF 配置中删除“mex”(元数据交换)端点来禁用 WSDL。

    【讨论】:

      猜你喜欢
      • 2012-04-17
      • 1970-01-01
      • 1970-01-01
      • 2022-12-13
      • 1970-01-01
      • 1970-01-01
      • 2012-08-18
      • 2016-11-19
      • 1970-01-01
      相关资源
      最近更新 更多