私はこれで頭がいっぱいです。.Net 2.0 asmx Web サービスから上記のエラーが発生することがあります。適切な XmlInclude() を配置しましたが、時々しか表示されません。サイトを再構築して更新すると、表示される場合と表示されない場合があります。韻や理由はありません。XmlIncludes() の一部を移動し、再構築して変更をプッシュすると、通常、エラーはなくなります。
すべてを DLL に変換するビルド プロセスを導入する前は、古き良き xcopy 展開方法を使用していました。そのときもエラーが発生しましたが、すべての XmlInclude() 呼び出しを定義するファイルにスペースを追加するだけで、IIS が再コンパイルされ、エラーは解消されました。
その価値のために、約 100 ほどの XmlIncludes が定義されています。
何か案は?
ここにスニペットがあります:
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:OK、もう少し詳細。web.config を変更してリサイクルを強制しても問題は解決せず、IIS を完全に再起動しても問題は解決しません。何らかの理由で、ログが正しく書き出されなかったため、スタック トレースはまだありません。
今回は、特定の2つのメソッドでエラーが発生していました。global.asax に変更を加え (スタック トレース ログの修正を試みるため)、再構築して更新すると、2 つの方法のうちの 1 つが機能し始めました。次に、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 Debug Assistants にアタッチして一連の更新を行うと、最終的には次のようになります。
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 のブログ投稿を使用して、生成されたアセンブリにステップ インしました。XmlInclude にもかかわらず、生成されたアセンブリには型への参照がないことが判明したため、これは間違いなく .NET のバグです。私はそれをトリガーするものを追跡しようとしていますが、出力アセンブリ (sgen?) を生成するものの何かが失敗しています。
編集#7:
これをフォローしている人のために参考までに、私はMSにバグレポートを提出しました:
https://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=523253