我在这个问题上的智慧结束了。我偶尔会从我的.Net 2.0 asmx Web服务中得到上述错误。我有适当的XmlInclude(),它只出现在有时 - 当我重建和更新网站时,它可能会显示,它可能不会,没有押韵或理由。如果我移动一些XmlIncludes(),重建并推送更改,则错误通常会消失。
在将所有内容转换为DLL的构建过程之前,我使用了良好的ol xcopy部署方法。然后发生了错误,但是我所要做的就是为定义所有XmlInclude()调用的文件添加一个空格,IIS将重新编译,错误就会消失。
对于它的价值,有很多XmlIncludes定义,大约100左右。
有什么想法吗?
这是一个片段:
namespace Courses{
[Serializable]
[XmlInclude(typeof(UserToCourse)),
XmlInclude(typeof(UserToCourseCollection)),
// ...lots more....
XmlInclude(typeof(ReadOnlySearchResultsRecordset<UserToCourse, UserToCourseCollection>)),
XmlInclude(typeof(AllCoursesByTrainingProgramCollection)),
XmlInclude(typeof(StartupObject))]
public partial class ServiceCallResult{
//..snipped class def
}
}
编辑: 重新排列XmlIncludes似乎会使错误消失,但下次重新编译和重新部署时可能会或可能不会返回。
编辑#2: 好的,还有一些细节。通过更改web.config强制回收不能解决问题,也不会完全重新启动IIS。出于某种原因,我的日志没有正确写出,所以我还没有堆栈跟踪。
这次,2个特定方法发生了错误。我对global.asax进行了更改(尝试修复我的堆栈跟踪日志记录),重建并更新,并且两种方法中的一种开始工作。然后我将带有XmlIncludes的类拆分为2个部分类,重建,更新,两个方法再次开始工作。我不确定这是不是永久性修复,因为它是如此随机;我将再次更新下一个构建周期。
编辑#3: 绝对不是一个永久的修复,我仍然没有陷入正确的位置来捕获完整的堆栈跟踪(虽然我的其他日志都工作正常)。啊。我将在下一轮再次更新。
编辑#4: 最后有一个堆栈跟踪。它不会在Visual Studio中捕获,也不会在我的global.asax中的全局异常处理程序中捕获。以下是直接从Web浏览器调用方法时显示的结果:
System.InvalidOperationException: There was an error generating the XML document. ---> System.InvalidOperationException: The type System.String[] may not be used in this context.
at System.Xml.Serialization.XmlSerializationWriter.WriteTypedPrimitive(String name, String ns, Object o, Boolean xsiType)
at Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationWriter1.Write1_Object(String n, String ns, Object o, Boolean isNullable, Boolean needType)
at Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationWriter1.Write119_ServiceCallResult(String n, String ns, ServiceCallResult o, Boolean isNullable, Boolean needType)
at Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationWriter1.Write397_ServiceCallResult(Object o)
at Microsoft.Xml.Serialization.GeneratedAssembly.ServiceCallResultSerializer277.Serialize(Object objectToSerialize, XmlSerializationWriter writer)
at System.Xml.Serialization.XmlSerializer.Serialize(XmlWriter xmlWriter, Object o, XmlSerializerNamespaces namespaces, String encodingStyle, String id)
--- End of inner exception stack trace ---
at System.Xml.Serialization.XmlSerializer.Serialize(XmlWriter xmlWriter, Object o, XmlSerializerNamespaces namespaces, String encodingStyle, String id)
at System.Xml.Serialization.XmlSerializer.Serialize(TextWriter textWriter, Object o, XmlSerializerNamespaces namespaces)
at System.Xml.Serialization.XmlSerializer.Serialize(TextWriter textWriter, Object o)
at System.Web.Services.Protocols.XmlReturnWriter.Write(HttpResponse response, Stream outputStream, Object returnValue)
at System.Web.Services.Protocols.HttpServerProtocol.WriteReturns(Object[] returnValues, Stream outputStream)
at System.Web.Services.Protocols.WebServiceHandler.WriteReturns(Object[] returnValues)
at System.Web.Services.Protocols.WebServiceHandler.Invoke()
编辑#5:
这可能是上述错误的症状,所以我不相信它是相关的,但无论如何我都会发布它。如果我附加到托管调试助手并刷新一堆,我最终得到:
Managed Debugging Assistant 'StreamWriterBufferedDataLost' has detected a problem in 'C:\Program Files\Common Files\Microsoft Shared\DevServer\9.0\WebDev.WebServer.EXE'.
Additional Information: A StreamWriter was not closed and all buffered data within that StreamWriter was not flushed to the underlying stream. (This was detected when the StreamWriter was finalized with data in its buffer.) A portion of the data was lost. Consider one of calling Close(), Flush(), setting the StreamWriter's AutoFlush property to true, or allocating the StreamWriter with a "using" statement. Stream type: System.Web.HttpResponseStream
File name: <unknown>
Allocated from:
at System.Environment.GetStackTrace(Exception e, Boolean needFileInfo)
at System.IO.StreamWriter.Init(Stream stream, Encoding encoding, Int32 bufferSize)
at System.IO.StreamWriter..ctor(Stream stream, Encoding encoding, Int32 bufferSize)
at System.IO.StreamWriter..ctor(Stream stream, Encoding encoding)
at System.Web.Services.Protocols.XmlReturnWriter.Write(HttpResponse response, Stream outputStream, Object returnValue)
at System.Web.Services.Protocols.HttpServerProtocol.WriteReturns(Object[] returnValues, Stream outputStream)
at System.Web.Services.Protocols.WebServiceHandler.WriteReturns(Object[] returnValues)
at System.Web.Services.Protocols.WebServiceHandler.Invoke()
at System.Web.Services.Protocols.WebServiceHandler.CoreProcessRequest()
at System.Web.Services.Protocols.SyncSessionlessHandler.ProcessRequest(HttpContext context)
at System.Web.Script.Services.ScriptHandlerFactory.HandlerWrapper.ProcessRequest(HttpContext context)
at System.Web.HttpApplication.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute()
at System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously)
at System.Web.HttpApplication.ApplicationStepManager.ResumeSteps(Exception error)
at System.Web.HttpApplication.System.Web.IHttpAsyncHandler.BeginProcessRequest(HttpContext context, AsyncCallback cb, Object extraData)
at System.Web.HttpRuntime.ProcessRequestInternal(HttpWorkerRequest wr)
at System.Web.HttpRuntime.ProcessRequestNoDemand(HttpWorkerRequest wr)
at System.Web.HttpRuntime.ProcessRequest(HttpWorkerRequest wr)
at Microsoft.VisualStudio.WebHost.Request.Process()
at Microsoft.VisualStudio.WebHost.Host.ProcessRequest(Connection conn)
我不确定它是否相关......可能只是错误流。
编辑#6:
好的,更多信息。我使用了Scott Hanselman的博客文章here来进入生成的程序集。事实证明,尽管有XmlInclude,生成的程序集也没有对其中的类型的引用,所以这绝对是.NET中的一个错误。我试图追踪触发它的是什么,但是产生输出组件(sgen?)的东西都失败了。
编辑#7:
对于此后的任何人,我都向MS提交了一份错误报告:
https://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=523253
答案 0 :(得分:1)
我最好的猜测(这是一个猜测)是触摸文件是一个红色的鲱鱼。我认为任何重新编译更有可能清除这一点。例如,您可以触摸web.config以强制循环来证明或反驳我的假设。
我怀疑这是因为您收到的错误与序列化问题有关。 XML Serializer很困惑,认为它无法序列化您的某个类型。因为你已经排除了许多常见的嫌疑,例如对象数组或包含其他本质上不可序列化的类型,我怀疑一个称赞竞争条件,例如你的两个程序集之间的循环引用是罪魁祸首。这种特殊情况将通过第二次汇编清除。
注意:检测循环引用的好工具是NDepend。
如果它不是循环引用,您是在使用任何代码生成器,使用任何构建提供程序还是使用反射来加载应用程序中的任何程序集或其他任何可能有点异国情调的程序集?
编辑:
根据您的评论,您没有做任何异国情调。因此,请检查程序集之间的循环引用和(只是想到这一点)冲突的依赖项。例如,SubSonic references a number of assemblies,如果你引用不同版本的这些程序集之一,它可以解释它是如何工作一次并使用相同的代码再次失败。
答案 1 :(得分:0)
好的,我有一个有效的解决方案,虽然我还不确定为什么。这绝对是生成的代理程序集中的错误。我发现生成的程序集有时会错过XmlIncludes中包含的某些类型。奇怪的是,它似乎是特定的类型,虽然我找不到那些为什么而不是其他的模式。
解决方案是创建一个部分类定义(它甚至在同一个文件中!),它只包含的XmlIncludes 那些一直导致问题的特定类型。从那时起,我根本没有看到错误。
肯定是发电机某处的一个错误,虽然是什么触发它我不知道。希望这会帮助其他人在路上。
修改强>
我相信我已经证实是什么导致了这个问题。我在.NET 2.0项目中引用了为.NET框架v1.1构建的SharpZipLib。当我构建app_code.dll时,它添加了对mscorlib 1.0.5的引用。显然,有这个额外的引用足以导致sgen不正确地生成调用Web服务时使用的临时DLL。因此,如果您遇到问题...在ILDASM中加载所有引用的程序集,请双击清单,并确认它们都不引用.NET 1.1。如果他们这样做......你就被软管了。
显然,这实际上没有解决它,因为问题仍然存在,只是因为不同的类型失败。