0

.net フレームワーク 3.5 に基づく asmx Web サービスがあります。サーバーにデプロイし、アプリ プールのフレームワーク バージョンを 4.0 (統合) に設定しました。変更を行った後、soap クライアントを使用して xml 形式でサービスにリクエストを送信しようとすると、アプリケーション プールのランタイム バージョンを 2.0 に変更すると、「ルート ライン 1 位置 1 でデータが無効です」というエラーが表示されます。 2003年のサーバーで今まで問題なく動作していました。誰かがこれで何が問題なのか教えてもらえますか?

問題を一点に絞り込むことができました。私が持っているサービスは前述の asmx サービスです。アプリケーション プールを 4.0 に変更し、soap クライアントを介してサービスに xml 要求を送信すると、エラー Data at root level is が発生することがわかりました。 xsd でのリクエストの検証時に指定された while ループでは無効です。以下の方法を見つけてください。エラーはwhileループで正確にスローされます。エラーが何であるかわかりません。このメソッドが呼び出される前に、リクエストがシリアル化されます。そのコードは以下にもあります。シリアル化中または検証中にエラーが発生しているかどうかはわかりません。つまり、リクエストが適切にシリアル化されていない可能性があるため、検証は失敗していますが、これについてはわかりません。

//シリアル化

       XmlSerializer serializer = new XmlSerializer(MyRequest.GetType()); //MyRequest is the input object.
       MemoryStream memoryStream = new MemoryStream();
        UnicodeEncoding uniEncoding = new UnicodeEncoding();
        TextWriter textWriter = new StreamWriter(memoryStream, Encoding.Unicode);
        serializer.Serialize(textWriter, MyRequest);
        int count = (int)memoryStream.Length;            
        byte[] requestArray = new byte[count];           
        memoryStream.Seek(0, SeekOrigin.Begin);
        memoryStream.Read(requestArray, 0, count);
        string stringXML= uniEncoding.GetString(requestArray).Trim();

    public bool ValidateXML(string stringXML, Uri schemaURI)
    {
        XmlSchemaSet sc = null;
        XmlReaderSettings settings = null; 
        XmlReader reader = null;
        StringReader txtReader = null;

        try
        {
            // Create the XmlSchemaSet class.
            sc = new XmlSchemaSet();

            sc.Add(null, schemaURI.ToString());

            // Set the validation settings.
            settings = new XmlReaderSettings();
            settings.ValidationType = ValidationType.Schema;
            settings.Schemas = sc;

            txtReader = new StringReader(stringXML);          
            // Create the XmlReader object.
            reader = XmlReader.Create(txtReader, settings);                                                             
             while (reader.Read())
            {             
            }
            reader.Close();
            return true;
        }                       
    }
4

1 に答える 1