【问题标题】:Exposing WCF metadata on a SiteMinder protected site在受 SiteMinder 保护的站点上公开 WCF 元数据
【发布时间】:2014-02-04 18:46:00
【问题描述】:

这可能是一个非常愚蠢的问题,但我一直无法找到解决方案。 我有一个托管在使用 SiteMinder 身份验证的站点上的 WCF 服务。身份验证依赖于客户端请求中的 cookie。问题是当我尝试使用 svcutil 生成代理类时,操作失败,因为当 svcutil 尝试获取元数据时,它显然没有将 SiteMinder cookie 添加到其请求中.因此我想知道是否有一种简单的方法可以以编程方式生成 WCF 服务代理类。

【问题讨论】:

    标签: wcf metadata proxy-classes siteminder


    【解决方案1】:

    如果您有权访问已编译的服务 DLL 文件,则可以使用 the SvcUtil command line utility 为数据协定生成 WSDL 和关联的 XSD。这种方法的主要问题是您需要在 schemaLocation 属性值的每个 xsd:import 元素中添加由 SvcUtil 生成的 XSD 文件的名称。

    以下是修改后的 xsd:import 元素示例。对于“http://tempuri.org/”命名空间,我添加了值为“tempuri.org.xsd”的 schemaLocation 属性,以让添加服务引用过程知道在与 WSDL 文件相同的文件夹中查找该文件。如果您的 WSDL 改用 wsdl:import,请添加位置属性而不是 schemaLocation 属性。这个related question and answer 应该是一个好的开始。

      <wsdl:types>
        <xsd:schema targetNamespace="http://tempuri.org/Imports">
          <xsd:import namespace="http://tempuri.org/" schemaLocation="tempuri.org.xsd" />
          <xsd:import namespace="http://schemas.microsoft.com/2003/10/Serialization/" schemaLocation="schemas.microsoft.com.2003.10.Serialization.xsd" />
        </xsd:schema>
      </wsdl:types>
    

    编辑:

    使用已编译的服务 DLL 生成客户端代码需要两个步骤。 SvcUtil 需要服务 WSDL 来生成客户端。不能直接使用编译好的DLL。

    首先使用包含 ServiceContract 的 DLL 生成 WSDL。如果服务合同 DLL 也在同一个文件夹中,我认为您可以使用服务实现文件。

    cd "\Path\To\Your\Service\DLLs"
    svcutil YourService.DLL
    

    这将根据您的服务结构创建多个文件。将有一个 .WSDL 文件和几个 .XSD 文件。如上所示编辑这些文件。

    最后,要么使用 Visual Studio 添加服务引用对话框选择编辑后的 ​​.WSDL 文件(只需输入完整路径和文件名)以生成客户端代码,要么使用 SvcUtil,如下所示:

    svcutil *.wsdl *.xsd /language:C#
    

    【讨论】:

    • 我的问题可能不太清楚:我的问题正是 svcutil 无法访问元数据,因为它受 SiteMinder 保护。
    • 对,您在 SvcUtil 命令行中使用服务 MEX URL,由于安全性,这将不起作用。我建议您使用包含服务合同的 DLL 生成 WSDL,然后从中生成客户端。我会更新答案以使其清楚。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-05
    • 1970-01-01
    • 1970-01-01
    • 2012-02-13
    • 2018-01-05
    • 1970-01-01
    相关资源
    最近更新 更多