Возможно ли обновить ссылку на службу WCF в проекте веб-развертывания - PullRequest
3 голосов
/ 19 февраля 2009

Я думаю, что название вопроса аккуратно подводит итог того, что я хочу. У меня есть веб-приложение и служба, и я хотел бы, чтобы скрипт сборки проверял, обновлялась ли служба с момента последней сборки, и если да, запускайте скрипт «update service reference», который будет доступен, если щелкнуть правой кнопкой мыши службу .

Есть идеи?

Ответы [ 2 ]

1 голос
/ 01 апреля 2009

Мы используем скрипт 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 "....................................................."
}

Все, что для этого требуется, - вы должны зарегистрировать папку «Веб-ссылки». Она перебирает каждый каталог и создает правильное пространство имен. Сценарий длинный, но я бы с удовольствием отправил его по электронной почте.

1 голос
/ 19 февраля 2009

Я не уверен, но я думаю, что есть способ сделать это через Visual Studio SDK. Напомню, что, например, есть объектная модель, на которую вы можете ссылаться, чтобы отобразить диалоговое окно «Добавить веб-ссылку». Без сомнения, вы также можете сделать «Обновить веб-ссылку». После этого появится возможность создать задачу MSBUILD, которая сделает это за вас.

Вам также следует учитывать, что такие задачи уже могут быть. Проверьте Codeplex и другие подобные места на предмет общедоступных коллекций задач MSBUILD, некоторые из которых могут помочь.

...