使用Visual Studio 2010,我们有一个包含多个网站(不是Web应用程序项目)和命令行和winforms项目的解决方案。所有目标.Net 2.0。许多项目都在Web站点中提供了对ASMX Web服务的Web引用。
Web服务经常更改,因此在编译所有内容时,我们必须手动完成所有项目并更新Web服务引用。我现在已成功使用disco.exe和wsdl.exe自动执行此操作。但我担心wsdl.exe生成的代码与VS中Web引用的手动更新存在差异。
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是新的。我坚持这个。
更新: 发现这篇文章讨论了差异:
如何跨多个Web应用程序项目共享动态URL
http://weblogs.asp.net/bradleyb/archive/2006/05/04/445133.aspx
答案 0 :(得分:3)
由于没有人回应(是的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结果。
更新:这是我的博文,其中包含我发现的所有链接:
http://www.amosfivesix.com/blog/23-net/165-programmatically-updating-web-references-in-net