1

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

4

1 回答 1

1

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

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

  <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#
于 2011-07-29T15:15:46.840 回答