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

时间:2009-02-19 19:50:54

标签: visual-studio web-services msbuild msbuild-task

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

有什么想法吗?

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

我们使用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”文件夹。它遍历每个目录并创建正确的命名空间。脚本很长,但我愿意通过电子邮件发送它。