10

奇妙な問題があります。システムの一部として一部の顧客にインストールされたWebサービスがあります。つまり、すべての顧客がWSの同一のコピーを持っています。

WSをコンパイルすると、サーバーとほとんどのお客様のマシンですべてが正常に機能していますが、次のエラーを報告することがあるお客様が1人います(通常、このお客様のWSは正常に機能しています。90%の確率で)。

Description:
AgentWS: [2852] [525] [Emergency] 
System.Xml.Schema.XmlSchemaException: The global attribute 'http://www.w3.org/XML/1998/namespace:lang' has already been declared.
   at System.Xml.Schema.XmlSchemaSet.InternalValidationCallback(Object sender, ValidationEventArgs e)
   at System.Xml.Schema.BaseProcessor.SendValidationEvent(XmlSchemaException e, XmlSeverityType severity)
   at System.Xml.Schema.BaseProcessor.AddToTable(XmlSchemaObjectTable table, XmlQualifiedName qname, XmlSchemaObject item)
   at System.Xml.Schema.Compiler.Prepare(XmlSchema schema, Boolean cleanup)
   at System.Xml.Schema.XmlSchemaSet.Compile()
   at System.Xml.Serialization.XmlSchemas.Compile(ValidationEventHandler handler, Boolean fullCompile)
   at System.Web.Services.Description.SchemaCompiler.Compile(XmlSchemas schemas)
   at System.Web.Services.Description.WebServicesInteroperability.AnalyzeDescription(ServiceDescriptionCollection descriptions, BasicProfileViolationCollection violations)
   at System.Web.Services.Description.WebServicesInteroperability.CheckConformance(WsiProfiles claims, ServiceDescriptionCollection descriptions, BasicProfileViolationCollection violations)
   at ASP.defaultwsdlhelpgenerator_aspx.Page_Load(Object sender, EventArgs e) in c:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\CONFIG\DefaultWsdlHelpGenerator.aspx:line 1439
   at System.Web.Util.CalliHelper.EventArgFunctionCaller(IntPtr fp, Object o, Object t, EventArgs e)
   at System.Web.Util.CalliEventHandlerDelegateProxy.Callback(Object sender, EventArgs e)
   at System.Web.UI.Control.OnLoad(EventArgs e)
   at System.Web.UI.Control.LoadRecursive()
   at System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)

誰かが何か考えがありますか?ありがとう!

4

8 に答える 8

11

あなたの問題はまさにそれが言っていることです:あなたはその特定の属性を2回定義します。これは、.NETのバグ(後で参照します)または単に構成の問題が原因で発生する可能性があります。私が話していることを理解し、特定の環境でそれを最もうまく処理する方法を理解できるように、それを再現する方法のレシピを紹介します。これはすべて、スタックトレースで参照される同じXmlSchemaSetオブジェクトに基づいています。

一部の手順は、私が使用しているツールに固有のものです。私は何かを考えることができる代替案を提供しようとします。

Base.xsd:これはxml.xsdファイルの代わりになります

<xs:schema elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xs:complexType name="something">
        <xs:sequence>
            <xs:element name="aha" type="xs:string" minOccurs="0"/>
        </xs:sequence>
    </xs:complexType>
</xs:schema>

Some.xsd:これはセットアップ内の他のXSDファイルのパーセホルダーです。それの特別な点は、さまざまなインクルード/インポートを介して、上記のBase.xsdに「到達」することです。

<xsd:schema elementFormDefault="qualified" xmlns:xsd="http://www.w3.org/2001/XMLSchema">    
    <xsd:include schemaLocation="base.xsd"/>
    <xsd:include schemaLocation="http://localhost:9090/base.xsd"/>

    <xsd:element name="a" type="something"/>    
</xsd:schema>

Base.xsdに「リーチアウト」するための複数の可能な方法を模倣するために、2つのインクルードを設定しました。

ローカルホストのURLはhttpサーバーを経由する必要があります。ローカルIIS、その他のHTTPサーバー、または必要に応じて制御できるHTTPモックソフトウェアを使用してください。

XmlSchemaSetに基づいて「Some.xsd」をコンパイルする小さなC#スクリプトを作成します。コンパイルメソッドのオンラインヘルプからのこのようなものは機能します。

まず、2番目のインクルードのURLが使用できないことを確認します。スクリプトを実行します。結果が正常にコンパイルされたことがわかります。

次に、URLが正常に機能していることを確認します。スクリプトを実行します。シナリオと同じエラーが発生します。コンテンツはすでに定義されています。

.NETでスキーマの読み込みがどのように機能するか、およびスキーマのコンパイルがどのように機能するかを理解する必要があります。結論として、同じURIから同じコンテンツを2回以上ロードする場合、XSDコンパイラーは通常それを理解するのに十分賢いです。2つの異なるURIから同じコンテンツをロードする場合、コンパイラーはユーザーの意図を推測できません。気になるすべての場合、URIが異なるとスキーマも異なるため、「宣言済み」エラーになります。

上記に基づいて、例外が発生したマシンでは、さまざまなURIを介してxml.xsdにアクセスできる可能性があります。

私はあなたのWSDLをロードし、そのすべての依存関係(他のWSDLや外部XSD)のグラフを提供する専用のツールを使用します。その中で、xml.xsdが2つの異なる場所からのものであるかどうかをすぐに確認する必要があります。

それでも十分な理解が得られない場合...トラブルシューティングするには、まず、外部接続なしでコンテンツを実行できるかどうかを確認します(「ネットワークプラグを抜く」と彼は言いました...)。次に、httpデバッガーを実行します。フィドラーは、WSが実行され、例外が発生するマシンと発生しないマシンでの例です。エラーを監視し、デバッグトレースと関連付けます。

これにより、正しい方向に進むことができます。一部のコメントとは異なり、WS-IBPチェックを無効にする必要はありません。あなたがすでにそれを理解したように、それはあなたの質問を実際には扱っていません。

.NETのバグに関しては、非常にリモートですが、可能性のあるシナリオです。パッチレベルはすでに確認済みだと思います。私がそれについて言及した唯一の理由は、私がそれに遭遇したためであり、それを回避するために独自のリゾルバーを作成する必要がありました。最新の.NETがまだ存在していても、それは常に現れます...だから、あなたの場合はこのバグだとは思えません...

于 2012-06-08T23:43:31.553 に答える
2

同様の問題が発生し、次のコードでも、グローバル属性がすでに定義されているという例外がスローされました。

    xmlSchemaSet = new XmlSchemaSet();
    xmlSchemaSet.Add(null, schemaFileName);
    xmlSchemaSet.Compile();

私が使用している定義が正しいため、どこかにキャッシュされています。ただし、簡単な解決策は、検証ハンドラーを追加し、エラーが発生したくないものを無視することです。

元のコードを変更して、スキーマ検証イベントハンドラーを作成します。

    xmlSchemaSet = new XmlSchemaSet();
    xmlSchemaSet.Add(null, schemaFileName);
    xmlSchemaSet.ValidationEventHandler += xmlSchemaSet_ValidationEventHandler;
    xmlSchemaSet.Compile();

次に、次のようなハンドラーを作成します。

/// <summary>
/// Ignore the global attribute already declared errors we sometimes get because of some caching.
/// This happens with xml.xsd.
/// </summary>
private static void xmlSchemaSet_ValidationEventHandler(object sender, ValidationEventArgs e)
{
  if (!e.Exception.Message.Contains("has already been declared"))
  {
    throw e.Exception;
  }
}
于 2014-03-25T14:29:39.143 に答える
1

プロジェクトのコンパイル中にMicrosoftVisualStudio 2013でWeb参照を追加すると、この問題が発生しました。これにより、WSDLジェネレータコードでマルチスレッドの問題が発生するようです。

クライアントコードのコンパイル時にWeb参照を追加しても、問題は発生しません。

于 2014-09-05T12:22:44.570 に答える
0

asmx-webserviceに投稿すると、このエラーがランダムにポップアップしました。この特定のサイトのweb.configで、いくつかのレガシーアセンブリリダイレクトが定義されていました。

<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
    <dependentAssembly>
        <assemblyIdentity name="System.Web.Extensions" publicKeyToken="31bf3856ad364e35"/>
        <bindingRedirect oldVersion="1.0.0.0-1.1.0.0" newVersion="3.5.0.0"/>
    </dependentAssembly>
    <dependentAssembly>
        <assemblyIdentity name="System.Web.Extensions.Design" publicKeyToken="31bf3856ad364e35"/>
        <bindingRedirect oldVersion="1.0.0.0-1.1.0.0" newVersion="3.5.0.0"/>
    </dependentAssembly>
</assemblyBinding>
</runtime>

確認後にそのセクションを削除すると、不要になり、問題が解決しました。

于 2012-12-10T14:59:43.003 に答える
0

これは、デフォルトのアプリケーションプール.NET 4で実行されているサイトに起因していることがわかりましたが、私のコードは3.5を対象としています。.NET 2を実行しているアプリケーションプールに変更すると、この問題は解決しました。これは2つの顧客のサーバーにあったので、物事を深く調べる前に試してみるのは間違いなく簡単な修正です:-)

よろしく

リアム

于 2016-10-12T14:15:47.703 に答える
0

.NETで、属性WebServiceのデフォルトのプロパティNamespace( "tempuri.org")を変更して修正しました。

于 2018-10-10T19:42:01.290 に答える
0

アプリケーションがfw4.5コードベースからfw4.7.2コードベースに更新された後、アプリケーションログの4つのサーバーのうちの1つでそのエラーが発生しました。アプリケーションプールの再起動は、この問題の修正に役立ちました。

于 2018-12-13T10:47:31.517 に答える
-1

web.configのsystem.webセクションにこれらの行が両方ある場合:

<compilation debug="true" targetFramework="XXX"/>
<httpRuntime targetFramework="XXX"/>

問題を解決するには、httpRuntimeノードを削除する必要があります。

于 2018-06-19T10:55:53.893 に答える