Динамическая сборка, сгенерированная на HttpWebRequest.GetResponse()

Похоже, наше приложение имеет утечку сборки. Я заметил, что при любых вызовах, когда вызов веб-службы вызывается с использованием объекта HttpWebRequest, динамическая сборка загружается при вызове httpWebRequest.GetResponse().

Я вижу, как сборка загружается через отладчик ("w3wp.exe" (управляемый): загружен "7-6jav6v", символы не загружены.), Но я не могу понять, почему это произойдет.

Кто-нибудь еще испытывал это раньше?

Изменить: Чтобы добавить разъяснения к этому вопросу. В C# при создании XmlSerializer создается сборка для завершения сериализации. Это всегда будет происходить, если вы не используете инструмент, чтобы сделать это для вас заранее. Если вы используете конструктор (Type type) или (Type type, строка "namespace"), то будет сгенерирована только 1 сборка. Если вы используете любой другой конструктор, то для каждой сериализации будет создаваться новая сборка.

Это не относится к проблеме, изложенной выше.

В нашей кодовой базе есть блок кода, который вручную выполняет мыльный вызов и возвращает строку (строка xml, например:). Каждый раз, когда этот блок кода выполняется, создается новая сборка. При проверке одной из этих сборок на это ссылаются "XmlSerializationWriter1.Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationReader1.XmlSerializer1.ArrayOfObjectSerializer.ArrayOfObjectSerializer1.ArrayOfObjectSerializer2"

Для лучшего понимания - блок кода выглядит следующим образом, и когда выполняется последняя строка, генерируется сборка... несколько сборок, по одной на каждый раз, когда выполняется этот блок.

HttpWebRequest oHttpWebRequest =(HttpWebRequest)WebRequest.Create("URL TO WEBSERVICE"); 
oHttpWebRequest.Timeout =((1000*60)*30);
oHttpWebRequest.Method ="POST" ; 
oHttpWebRequest.ContentType ="text/xml" ; 
oHttpWebRequest.Headers.Add("SOAPAction: http://www.tempuri.com/"+WebMethodName); 
StreamWriter oStreamWriter = new StreamWriter(oHttpWebRequest.GetRequestStream()) ; 

string SoapRequest=@"<soap:Envelope xmlns:xsi=""http://www.w3.org/2001/XMLSchema-instance"" xmlns:xsd=""http://www.w3.org/2001/XMLSchema"" xmlns:soap=""http://schemas.xmlsoap.org/soap/envelope/""><soap:Body>";
SoapRequest=SoapRequest + HttpUtility.HtmlDecode(XmlHttpRequestData);
SoapRequest=SoapRequest + @"</soap:Body></soap:Envelope>";
oStreamWriter.Write(SoapRequest); 
oStreamWriter.Close();

oHttpWebRequest.ProtocolVersion.Build;

WebResponse oWebResponse = oHttpWebRequest.GetResponse() ; 

2 ответа

Согласно вашему комментарию под ответом Sky Sanders, сгенерированные сборки предназначены для сериализации XML. Сборки сериализации генерируются динамически, если вы предварительно не сгенерировали их с помощью средства XML Serializer Generator Tool (Sgen.exe). Если вы это сделаете, будут использованы существующие сборки, и сборка не будет создана.

Является ли схема XML для веб-служб, которые вы называете, фиксированной или динамической? Если вы вызываете произвольные веб-сервисы, каждый из которых принимает произвольные XML-сообщения в качестве входных данных и возвращает произвольные XML-сообщения в качестве выходных... тогда XmlSerializer собирается создать новую сборку для каждой схемы. Если каждое сообщение по существу использует одну и ту же схему, но достаточно различается по структуре, даже если они могут использовать общую схему, XmlSerializer способен только на это... он собирается сгенерировать сборку для обработки каждой конкретной схемы, которую он идентифицирует.

Как сказал Томас, если ваша схема исправлена, используйте инструмент XML Serializer Generator Tool для предварительной генерации ваших сериализационных сборок.

Другие вопросы по тегам