.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;
}
}