Код прокси-сервера веб-службы, сгенерированный WSDL.exe и "Обновление веб-справки" - меня это волнует?
Используя 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.
PS: я знаю, что ASMX старый и WCF новый. Я застрял с этим.
ОБНОВЛЕНИЕ: нашел эту статью, которая говорит о разнице:
Как совместно использовать динамические URL-адреса в нескольких проектах веб-приложений
http://weblogs.asp.net/bradleyb/archive/2006/05/04/445133.aspx
1 ответ
Так как никто не ответил (ага!), Я хотя бы опубликую то, что нашел. Если вы действительно хотите увидеть, как генерируется код 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.
Обновление: вот мое сообщение в блоге со всеми ссылками, которые я нашел:
http://www.amosfivesix.com/blog/23-net/165-programmatically-updating-web-references-in-net