Я не думаю так. Вы управляете, когда Располагают, назван, что означает, что Вы могли в теории писать код распоряжения, который делает предположения о (например), существовании других объектов. Вы не имеете никакого контроля, когда финализатор называют, таким образом, это было бы сомнительно, чтобы иметь финализатор, автоматически звонят, Располагают от Вашего имени.
<час>РЕДАКТИРОВАНИЕ: Я ушел и протестировал, только для проверки:
class Program
{
static void Main(string[] args)
{
Fred f = new Fred();
f = null;
GC.Collect();
GC.WaitForPendingFinalizers();
Console.WriteLine("Fred's gone, and he's not coming back...");
Console.ReadLine();
}
}
class Fred : IDisposable
{
~Fred()
{
Console.WriteLine("Being finalized");
}
void IDisposable.Dispose()
{
Console.WriteLine("Being Disposed");
}
}
Что ж, наконец-то я заставил это работать, поэтому я напишу здесь код, который использую. (Помните, что .Net 2.0 и нет wsdl для получения из веб-службы.)
Сначала мы создаем HttpWebRequest:
public static HttpWebRequest CreateWebRequest(string url)
{
HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create(url);
webRequest.Headers.Add("SOAP:Action");
webRequest.ContentType = "text/xml;charset=\"utf-8\"";
webRequest.Accept = "text/xml";
webRequest.Method = "POST";
return webRequest;
}
Затем мы вызываем веб-службу, передавая все необходимые значения. Когда я читаю мыльный конверт из XML-документа, я буду обрабатывать данные как StringDictionary. Это должен быть лучший способ сделать это, но я подумаю об этом позже:
public static XmlDocument ServiceCall(string url, int service, StringDictionary data)
{
HttpWebRequest request = CreateWebRequest(url);
XmlDocument soapEnvelopeXml = GetSoapXml(service, data);
using (Stream stream = request.GetRequestStream())
{
soapEnvelopeXml.Save(stream);
}
IAsyncResult asyncResult = request.BeginGetResponse(null, null);
asyncResult.AsyncWaitHandle.WaitOne();
string soapResult;
using (WebResponse webResponse = request.EndGetResponse(asyncResult))
using (StreamReader rd = new StreamReader(webResponse.GetResponseStream()))
{
soapResult = rd.ReadToEnd();
}
File.WriteAllText(HttpContext.Current.Server.MapPath("/servicios/" + DateTime.Now.Ticks.ToString() + "assor_r" + service.ToString() + ".xml"), soapResult);
XmlDocument resp = new XmlDocument();
resp.LoadXml(soapResult);
return resp;
}
Итак, это все. Если кто-то подумает, что к ответу нужно добавить GetSoapXml, я запишу.
На мой взгляд, для веб-службы SOAP нет оправдания, чтобы не предоставлять WSDL. Он не должен динамически генерироваться службой; он не обязательно должен быть доступен через Интернет. Но там должен быть WSDL, даже если они должны отправить его вам на гибком диске флэш-накопителе!
Если у вас есть возможность пожаловаться поставщикам этого службы, то я призываю вас сделать это. Если у вас есть возможность дать отпор, сделайте это. В идеале смените поставщика услуг и скажите этим людям, что это потому, что они не предоставили WSDL. По крайней мере, выясните, почему они не считают это важным.
Хм, здесь сложно, но возможно, но я сделаю все возможное, чтобы объяснить его.
Что вам нужно сделать, так это
Я постараюсь добавить больше, когда и когда я подумаю об этом, но этого должно быть достаточно, чтобы вы начали.
Если вам повезет, вы все равно сможете получить wsdl. Некоторые структуры веб-сервисов позволяют вам получать динамически сгенерированный WSDL.
Веб-сервисы, написанные с помощью Axis1.x, позволяют вам получать динамически сгенерированный файл WSDL, просматривая URL-адрес.
Просто перейдите к
http://server/service.soap/?wsdl
Я не знаю ' Не знаю, возможно ли это с другими фреймворками.