这可能是一个非常愚蠢的问题,但我一直无法找到解决方案。 我在使用SiteMinder身份验证的站点上托管了WCF服务。身份验证依赖于客户端请求中的cookie。问题是,当我尝试使用svcutil生成代理类时,操作失败,因为当svcutill尝试获取元数据时,它显然不会将SiteMinder cookie添加到其请求中因此,我想知道是否有一种以编程方式生成WCF服务代理类的简单方法。
答案 0 :(得分:1)
如果您有权访问已编译的服务DLL文件,则可以使用the SvcUtil command line utility为数据协定生成WSDL和关联的XSD。这种方法的主要缺点是你需要在schemaLocation属性值的每个xsd:import元素中添加由SvcUtil生成的XSD文件的名称。
以下是修改过的xsd:import元素的示例。对于“http://tempuri.org/”命名空间,我添加了schemaLocation属性,其值为“tempuri.org.xsd”,以使Add Service Reference进程知道在与WSDL文件相同的文件夹中查找该文件。如果您的WSDL使用wsdl:import,则添加location属性而不是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#