- ベストアンサー
Webサイトのxmlファイル更新方法
- Webサイトにあるxmlファイルを更新する方法を教えてください。
- 開発環境はVisual Studio .NET 2003と.NET Framework 1.1で、言語はC#です。
- 自作クラスに保持した情報をシリアライズ・デシリアライズしxmlファイルで保存しようとしていますが、Webサイトでのテストでエラーが発生しています。エラー内容は「ストリームに書き込めませんでした」です。
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
himajin100000の日記 まず,当方環境は.NET 3.5(.NET 2.0ベース)とVB.NET Orcas Beta1を用いていることを述べておく。 回答するにあたり、サンプルソースを内容を変化させずにVB.NETに移植して動作させてみたが, ローカル環境においても動作しなかった。 原因はいくつかあって、 まず最初に気づいたのは Dim fs As System.IO.Stream = TryCast(resolver.GetEntity(myUri, null, Type.GetType("System.IO.Stream")),System.IO.Stream) によってfsに格納されたSystem.IO.StreamのCanWriteプロパティ[ReadOnly]がFalseだったこと。 dobon.netの内容を参考にSystem.IO.FileStreamのコンストラクタの第二引数にSystem.IO.FileMode.Create を与えることで,書き込みができるオブジェクトが得られるだろうと考えた。 http://dobon.net/vb/dotnet/file/xmlserializer.html そこでSystem.IO.IOStreamオブジェクトとSystem.IO.FileMode.Createを引数に与えて System.IO.FileStreamを得る方法に自信がなかったし,必要性もよくわからなかったのでresolver.GetEntityを経由せず、 system.uriを直接指定する形をとり Namespace hoge Module Module1 Sub Main() 'Dim myUri As System.Uri = New System.Uri("C:\Data\Administrator\Oshiete_Goo\(略)\Q3200230A\SerializedObject.xml") 'Dim resolver As System.Xml.XmlUrlResolver = New System.Xml.XmlUrlResolver() Dim d_MyData As New Mydata Dim serializer As System.Xml.Serialization.XmlSerializer = New System.Xml.Serialization.XmlSerializer(Type.GetType("ConsoleApplication1.hoge.Mydata")) Dim fs As System.IO.FileStream = New System.IO.FileStream(myUri.AbsoluteUri, System.IO.FileMode.Create) serializer.Serialize(fs, d_MyData) End Sub End Module Public Class Mydata Public hoge As Integer Sub New() hoge = 3 End Sub End Class End Namespace としたが、やっぱり動作しなかった。 少し考えて 'Dim myUri As System.Uri = New System.Uri("C:\Data\Administrator\Oshiete_Goo\(略)\Q3200230A\SerializedObject.xml") とコメントアウトし Dim fs As System.IO.FileStream = New System.IO.FileStream("C:\Data\Administrator\Oshiete_Goo\(略)\Q3200230A\SerializedObject.xml", System.IO.FileMode.Create) とファイル名を直に与えたところ動作したため,実行時のmyUri.Absoluteuriを見たら file:///で始まっていて、出たエラーが「URI フォーマットはサポートされていません。」だった。 ここでピンと来たのだが, 【http://で始まるURIを指定しているということは当たり前ながら使っているプロトコルはHTTPである。 HTTPでファイルを作成したりするにはPUTメソッド等を用いるはずで, serializer.Serialize(fs, d_MyData)の処理中にあるであろう 書き込み処理の仕方はローカルでファイルを書き込む方法とは異なるはずだ。 これらのクラスはそこまで考えられているだろうか?】 もしコレが原因なら,場合によってはFTPを使う方法やHTTPでPUTメソッドを使う方法で回避することになる。 リモートマシンへの書き込み方法を調べていると, UNCという言葉に行き当たった。 http://www.atmarkit.co.jp/icd/root/91/5787091.html もともと,以前うちでは家族に言われて俺が実験的にNetBIOSの設定等をする羽目になり, その勉強として色々学んだからなんとなく勝手はわかる。 コンピュータ名はHIMAJINだ。 ローカルマシン上にgyaフォルダを作成し このフォルダにgyaという共有名をつけて共有。 フルコントロール権をAdministrator,Administrators,CreateOwner,EveryOneに与え, Namespace hoge Module Module1 Sub Main() 'Dim myUri As System.Uri = New System.Uri("C:\Data\Administrator\Oshiete_Goo\(略)\Q3200230A\SerializedObject.xml") 'Dim resolver As System.Xml.XmlUrlResolver = New System.Xml.XmlUrlResolver() Dim d_MyData As New Mydata Dim serializer As System.Xml.Serialization.XmlSerializer = New System.Xml.Serialization.XmlSerializer(Type.GetType("ConsoleApplication1.hoge.Mydata")) Dim fs As System.IO.FileStream = New System.IO.FileStream("\\HIMAJIN\gya\test.xml", System.IO.FileMode.Create) 'Dim fs As System.IO.FileStream = New System.IO.FileStream("C:\Data\Administrator\Oshiete_Goo\Quarter2\Q3200230\Q3200230A\Q3200230A\SerializedObject.xml", System.IO.FileMode.Create) serializer.Serialize(fs, d_MyData) End Sub End Module Public Class Mydata Public hoge As Integer Sub New() hoge = 3 End Sub End Class End Namespace どきどきしながら実行してみるとファイルが作成された。 やはりそれがスキームが原因だったのだろう。
お礼
himajin100000様 回答ありがとうございます。 http経由で書き込み処理する時に、System.IO.FileStreamがサポートされてないのが原因のようですね。 Webサービス経由でオブジェクトを渡して、そこからWebサーバー内にSystem.IO.FileStreamで書き込む方法で試してみたいと思います。 ありがとうございました。