7

私はこれで頭がいっぱいです。.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

4

2 に答える 2

1

私の最善の推測 (そして推測です) は、ファイルに触れることは赤いニシンであるということです。再コンパイルによってこれが解決される可能性が高いと思います。たとえば、web.config に触れて、これが発生したときにリサイクルを強制して、私の仮定を証明または反証することができます。

私がこれを疑う理由は、受け取ったエラーがシリアル化の問題に関連しているためです。XML シリアライザーは、型の 1 つをシリアル化できないと考えて混乱しています。オブジェクト配列や本質的にシリアル化できない他の型の組み込みなど、多くの一般的な容疑を除外したため、2 つのアセンブリ間の循環参照などのコンパイル競合状態が原因であると思われます。この特定のケースは、2 回目のコンパイルによって解決されます。

注: 循環参照を検出する優れたツールはNDependです。

循環参照でない場合、コード生成、ビルド プロバイダーの使用、またはリフレクションを使用したアプリ内のアセンブリの読み込みなど、少し変わったものを行っていますか?

編集:

あなたのコメントに基づいて、あなたはエキゾチックなことをしていません。そのため、循環参照と (これを考えただけで)アセンブリ間の依存関係の競合を確認してください。たとえば、SubSonic は多数のアセンブリを参照しており、異なるバージョンのこれらのアセンブリの 1 つを参照すると、同じコードで一度は動作し、別のときに失敗する方法を説明できます。

于 2009-10-25T17:22:33.127 に答える
0

OK、うまくいく解決策がありますが、理由はまだわかりません。これは間違いなく、生成されたプロキシ アセンブリのバグです。生成されたアセンブリで、XmlIncludes に含まれる型の一部が欠落している場合があることがわかりました。奇妙なことに、具体的には特定のタイプのように見えましたが、それらのタイプで他のタイプではない理由のパターンを見つけることはできません.

解決策は、一貫して問題を引き起こしている特定の型のみに XmlIncludes を持つ部分的なクラス定義を作成することでした (それは同じファイル内にあります!) 。それ以来、私はエラーをまったく見ていません。

間違いなくジェネレーターのどこかにバグがありますが、何が原因かはわかりません。うまくいけば、これは他の誰かの助けになるでしょう。

編集 問題の原因を確認したと思います。私の .NET 2.0 プロジェクトには、.NET フレームワーク v1.1 用に構築された SharpZipLib への参照がありました。app_code.dll をビルドすると、mscorlib 1.0.5 への参照が追加されました。どうやら、この追加の参照があると、sgen が Web サービスの呼び出し時に使用される一時 DLL を不適切に生成するのに十分でした。したがって、問題が発生した場合は、参照されているすべてのアセンブリを ILDASM にロードし、マニフェストをダブルクリックして、いずれも .NET 1.1 を参照していないことを確認します。もしそうなら...あなたはうんざりしています。

どうやら、これで実際に修正されたわけではなく、別のタイプが失敗しただけで、問題がまだ残っているようです。

于 2009-12-03T17:06:40.803 に答える