Код прокси-сервера веб-службы, сгенерированный WSDL.exe и «Обновление веб-справки» - меня это волнует? - PullRequest
4 голосов
/ 21 января 2012

Используя Visual Studio 2010, у нас есть решение с несколькими веб-сайтами (не проектами веб-приложений) и командной строкой и проектами winforms. Все целевые .Net 2.0. Многие из проектов имеют ссылки на веб-службы ASMX на веб-сайтах.

Веб-службы часто меняются, поэтому, когда мы все компилируем, нам приходится вручную просматривать все проекты и обновлять ссылки на веб-службы. Теперь мне удалось автоматизировать это с помощью disco.exe и wsdl.exe . Но меня беспокоят различия в коде, генерируемом wsdl.exe, и ручное обновление веб-ссылки в VS.

wsdl.exe генерирует такой код:

public WebServiceName() {
    string urlSetting = System.Configuration.ConfigurationManager.AppSettings["WebServiceName"];
    if ((urlSetting != null)) {
        this.Url = urlSetting;
    }
    else {
        this.Url = "http://example/webservicename.asmx";
    }
}

Пока VS генерирует код, подобный этому:

private bool useDefaultCredentialsSetExplicitly;

public WebServiceName() {
    this.Url = global::ProjectName.Properties.Settings.Default.ProjectName_WebServiceNameWebService_WebServiceName;
    if ((this.IsLocalFileSystemWebService(this.Url) == true)) {
        this.UseDefaultCredentials = true;
        this.useDefaultCredentialsSetExplicitly = false;
    }
    else {
        this.useDefaultCredentialsSetExplicitly = true;
    }
}

public new string Url {
    get {
        return base.Url;
    }
    set {
        if ((((this.IsLocalFileSystemWebService(base.Url) == true) 
                    && (this.useDefaultCredentialsSetExplicitly == false)) 
                    && (this.IsLocalFileSystemWebService(value) == false))) {
            base.UseDefaultCredentials = false;
        }
        base.Url = value;
    }
}

public new bool UseDefaultCredentials {
    get {
        return base.UseDefaultCredentials;
    }
    set {
        base.UseDefaultCredentials = value;
        this.useDefaultCredentialsSetExplicitly = true;
    }
}

private bool IsLocalFileSystemWebService(string url) {
    if (((url == null) 
                || (url == string.Empty))) {
        return false;
    }
    System.Uri wsUri = new System.Uri(url);
    if (((wsUri.Port >= 1024) 
                && (string.Compare(wsUri.Host, "localHost", System.StringComparison.OrdinalIgnoreCase) == 0))) {
        return true;
    }
    return false;
}

Все остальное в основном то же самое. Мне нужно беспокоиться об этом? Это, безусловно, означает, что нам придется изменить способ хранения URL переопределения в файлах app.config и web.config. wsdl.exe использует appSettings, VS использует configSections / applicationSettings.

P.S .: Я знаю, что ASMX старый и WCF новый. Я застрял с этим.

UPDATE: Нашел эту статью, в которой говорится о разнице:

Как совместно использовать динамические URL-адреса в нескольких проектах веб-приложений

http://weblogs.asp.net/bradleyb/archive/2006/05/04/445133.aspx

1 Ответ

4 голосов
/ 10 февраля 2012

Так как никто не ответил (да Tumbleweed!), Я по крайней мере отправлю то, что я нашел. Если вы действительно хотите увидеть, как генерируется код VS, он находится внутри Microsoft.VSDesigner.dll. Моя машина имеет версии 8.0 и 9.0. Вот путь. Я не знаю, будет ли это соответствовать тому, что в вашей системе:

C:\Windows\assembly\GAC_MSIL\Microsoft.VSDesigner\8.0.0.0__b03f5f7f11d50a3a\Microsoft.VSDesigner.dll

Если вы откроете его с помощью Reflector , посмотрите на метод GenerateCode в Microsoft.VSDesigner.CodeGenerator.DiscoCodeGenerator. Это вызывает метод ServiceDescriptionImporter.GenerateWebReferences для генерации базового кода, как это делает Wsdl.exe, а затем модифицирует код для получения результата VS.

...