====== 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を使うリゾルバを作った]]。