代码之家  ›  专栏  ›  技术社区  ›  KevDog

是否可以在Web部署项目中更新WCF服务引用

  •  3
  • KevDog  · 技术社区  · 17 年前

    我认为问题的标题很好地概括了我所追求的。我有一个web应用程序和一个服务,我希望构建脚本检查自上次构建以来服务是否已更新,如果是,请运行右键单击服务时可用的“更新服务引用”脚本。

    2 回复  |  直到 17 年前
        1
  •  1
  •   John Saunders    17 年前

    我们使用PowerShell脚本为我们运行wsdl.exe工具(或者在您的情况下为svcutil.exe)。脚本运行到服务并提取一个新的wsdl并重新生成代理。您可以使用来访问PS。唯一的诀窍是正确获取命名空间,但wsdl.exe上有一个选项。

    <Target Name="UpdateWebReferences">
    
    <Exec WorkingDirectory="$(SolutionRoot)" 
          Command="$(PS) -Noninteractive -Command $(SolutionRoot)\tools\PowerShell\Compile-Wsdl.ps1 -ukf $(ConfigFilePath)" 
          Condition=" Exists('$(ConfigFilePath)') And Exists('$(SolutionRoot)\tools\PowerShell\Compile-Wsdl.ps1') " />
    

    以上内容适用于您的团队建设。powershell函数的作用如下:

    $projectFile = [xml]( Get-Content $projectFilePath ) 
    
    if ( $projectFile -and $WSDL_LANGUAGE -ne "VB")
    {
        $ns = $projectFile.Project.PropertyGroup[ 0 ].RootNamespace
    }
    else
    {
        $ns = $NAMESPACE_PREFIX
    }
    
    foreach( $webRefDir in Get-ChildItem $dir.FullName )
    {
        $webRefName = $webRefDir.Name
    
        if ( [System.String]::IsNullOrEmpty( $ns ) )
        {
            $namespace = $webRefName
        }
        else
        {
            $namespace = $( "{0}.{1}" -f $ns, $webRefName )
        }
    
        Write-Host $( "Compiling Web Reference: {0} using Namespace: {1}..." -f $webRefName, $namespace )
    
        $outputPath = $( "{0}\{1}" -f $webRefDir.FullName,$REFERENCE_FILE )
    
        $xpath = "/configuration/appSettings/add[@key='{0}']" -f $webRefName
    
        if ( $URL_KEY_FILE )
        {
            $xml = [xml](Get-Content $URL_KEY_FILE)
            $url = $xml.SelectSingleNode( $xpath )
    
            if ( $url )
            {
                $urlOrPath = $url.Value
            }
            else
            {
                Write-Warning $( "Could not find key {0} in {1}..." -f $webRefName, $URL_KEY_FILE )
            }
        }
        else
        {
            $urlOrPath = $( Get-ChildItem $webRefDir.FullName -r -filter "*.wsdl" ).FullName
        }   
    
        if ( $urlOrPath )
        {
            wsdl /nologo /language:$WSDL_LANGUAGE /n:$namespace /o:$outputPath /urlkey:$webRefName $urlOrPath
        }
    
        Write-Host "....................................................."
    }
    

    为此,您只需签入“Web References”文件夹。它会遍历每个目录并创建正确的命名空间。剧本很长,但我愿意通过电子邮件发送。

        2
  •  1
  •   Adam Fyles    15 年前

    我不确定,但我认为有一种方法可以通过Visual Studio SDK来实现。我记得,例如,您可以引用一个对象模型来显示“添加Web引用”对话框。毫无疑问,你也可以做一个“更新网络参考”。然后,应该可以创建一个MSBUILD任务来为您完成此操作。

    你还应该考虑到,可能已经有这样的任务了。检查Codeplex和其他此类地方是否有MSBUILD任务的公共集合,其中一些可能会有所帮助。