看来我们的应用程序有一个程序集泄漏。我注意到在使用HttpWebRequest对象调用Web服务调用的任何调用中,在调用httpWebRequest.GetResponse()上加载动态程序集
我可以看到程序集通过调试器加载('w3wp.exe'(托管):已加载'7-6jav6v',没有加载符号。)但我无法弄清楚为什么会发生这种情况。
有没有其他人经历过这个?
编辑: 添加对此问题的说明。 在c#中创建XmlSerializer时,会创建一个程序集以完成序列化。除非您事先使用工具为您执行此操作,否则始终会发生这种情况。如果使用(Type type)或(Type type,string“namespace”)的构造函数,则只生成一个程序集。如果使用任何其他构造函数,则将为每个序列化生成新程序集。
上述问题并非如此。
我们的代码库中有一段代码,它们手动进行soap调用并返回一个字符串(字符串是xml,ex:)。每次执行此代码块时,都会创建一个新程序集。在检查其中一个程序集时,会引用“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() ;
答案 0 :(得分:1)
根据您在Sky Sanders的回答下的评论,生成的程序集用于XML序列化。除非使用XML Serializer Generator Tool (Sgen.exe)预生成序列化程序集,否则将动态生成序列化程序集。如果这样做,将使用现有的程序集,不会生成任何程序集
答案 1 :(得分:0)
您调用的Web服务的xml架构是固定的还是动态的?如果要调用任意Web服务,每个Web服务都将任意XML消息作为输入并将任意XML消息作为输出返回......那么XmlSerializer将为每个模式创建一个新的程序集。如果每条消息本质上使用相同的模式,但结构变化不大,即使它们可以使用公共模式,XmlSerializer也只能这样......它将生成一个程序集来处理它识别的每个特定模式。
就像Thomas所说,如果您的架构已修复,请使用XML Serializer Generator Tool预生成序列化程序集。