私のASP.NET Web フォームアプリケーションでは、ユーザーが XML ファイルをダウンロードできるようにする必要があります。そのために、ダウンロード ボタンを押すと、次のコードが実行されます。
Response.Clear()
Response.CacheControl = "Private"
Response.Cache.SetExpires(DateTime.Now.AddMinutes(3))
Response.ContentEncoding = Encoding.GetEncoding("ISO-8859-1")
Response.ContentType = "text/xml"
Response.AddHeader("Content-Disposition", String.Format("attachment; filename={0}.xml", fileName))
Dim xmlFile As String = _xmlServices.GetXmlFile(fileId);
If Not String.IsNullOrEmpty(xmlFile) Then
Dim xdoc As XmlDocument = New XmlDocument()
xdoc.LoadXml(xmlFile)
xdoc.Save(Response.Output)
End If
Response.Flush()
Response.End()
このGetXmlFile(fileId)
関数は、XML を含む文字列を返します。取得された文字列は、既に指定されたエンコーディング ( <?xml version="1.0" encoding="ISO-8859-1"?>
) と署名付きです。つまり、ファイルが変更されると、署名は無効になります。
私はWPF アプリケーションに同じ関数を使用していますGetXmlFile(fileId)
が、完全に機能します。
ただし、私の ASP.NET アプリケーションでは、次の 2 つの問題があります。
Response.ContentEncoding = Encoding.GetEncoding("ISO-8859-1")
ダウンロードした XML ファイルのエンコーディングを明示的に指定しないと、<?xml version="1.0" encoding="UTF-8"?>
. これは大きな問題ではありません。ASP.NET アプリケーションからダウンロードした XML ファイルには、 WPF アプリケーションからダウンロードしたファイルよりも改行文字が 1 文字多く含まれています。キャリッジ リターンがタグの最後に表示され、データが損なわれないため、ファイルは解析すると同じように見える場合があります。しかし、ファイルは配置後に変更されているため、署名は有効ではありません。
Response.Output
したがって、どういうわけか、ストリームが何らかの形でファイルを変更すると思います。または、このエラーの背後に別の理由がある可能性がありますか?