以下是一位同事撰写的示例代码.这对我来说显然是错的,但我想检查一下.一个对象应该从一个自己的方法中调用自己的Dispose()方法吗?在我看来,只有对象的所有者/创建者在完成对象而不是对象本身时才应该调用Dispose().
它是一个.asmx web方法,在完成时调用Dispose().(事实上,这是一个Web方法可能是一般问题的偶然事实.)在我们的代码库中,我们有时在其他Web服务的方法中实例化Web服务类,然后调用它们上的方法.如果我的代码执行此操作来调用此方法,则该方法返回时该对象是toast,并且我无法再使用该对象.
[WebMethod]
public string MyWebMethod()
{
try
{
return doSomething();
}
catch(Exception exception)
{
return string.Empty;
}
finally
{
Dispose(true);
}
}
Run Code Online (Sandbox Code Playgroud)
更新:找到一些相关的链接:
使用 Visual Studio 2010,我们有一个包含多个网站(不是 Web 应用程序项目)以及命令行和 winforms 项目的解决方案。所有目标都是.Net 2.0。许多项目在网站中都有对 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";
}
}
Run Code Online (Sandbox Code Playgroud)
而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; …Run Code Online (Sandbox Code Playgroud)