====== C#のCreateDocumentTypeがタイムアウトする時の簡易対策 ====== C#の''XmlDocument''でHTMLを生成しようと、W3CのDTDを指定して''XmlDocument.CreateDocumentType()''するとタイムアウトやHTTPステータスコード500で例外を吐くことがある。こちとらvalidなHTMLを生成しようと真面目に指定してんのに、この仕打である(´・ω・`)。みんなW3Cを見に行って慢性的な高負荷状態になってるのが原因らしいが、まぁ当然そうなりますわな…。 コードにすると↓な感じ。 XmlDocument doc = new XmlDocument(); XmlDocumentType docType = doc.CreateDocumentType( "HTML", "-//W3C//DTD HTML 4.01 Frameset//EN", "https://www.w3.org/TR/html401/frameset.dtd", null); /* ここでエラー */ ''XmlResolver''でローカルキャッシュしたDTDをマッピングするのが正攻法らしいのだが、ぶっちゃけ面倒。というか、調べても良くわからんかったのでパスw(分かったら追記する…多分) とりあえずエラーを回避するだけなら、''CreateDocumentType''実行前に''XmlDocument.Resolver''を''null''にしてやればOKっぽい。コードにするまでもないが一応書いておく。 XmlDocument doc = new XmlDocument(); doc.Resolver = null; // 追加 XmlDocumentType docType = doc.CreateDocumentType( "HTML", "-//W3C//DTD HTML 4.01 Frameset//EN", "https://www.w3.org/TR/html401/frameset.dtd", null); /* エラーにならない */ ・・・と、ここまで書いて思ったが、これで回避できるって事は自前実装したXMLリゾルバでDTD返してやればいいだけなんじゃね? ===== 2016-04-13追記 ===== といわけで[[2016-04-13|ローカルのDTDを使うリゾルバを作った]]。