差分

このページの2つのバージョン間の差分を表示します。

この比較画面にリンクする

次のリビジョン
前のリビジョン
blog:2016:2016-02-24 [2016-02-24 17:44]
Decomo 作成
blog:2016:2016-02-24 [2016-04-13 17:30] (現在)
Decomo
行 1: 行 1:
 ====== C#のCreateDocumentTypeがタイムアウトする時の簡易対策 ====== ====== C#のCreateDocumentTypeがタイムアウトする時の簡易対策 ======
  
-C#の''XmlDocument''でHTMLを生成しようと、W3CのDTDを指定して''XmlDocument.CreateDocumentType()''するとタイムアウトやHTTPステータスコード500で例外を吐くことがある。こちとらvalidなHTMLを生成しようと真面目に指定してんのに、この仕打である(´・ω・`)。コードにすると↓な感じ。+C#の''XmlDocument''でHTMLを生成しようと、W3CのDTDを指定して''XmlDocument.CreateDocumentType()''するとタイムアウトやHTTPステータスコード500で例外を吐くことがある。こちとらvalidなHTMLを生成しようと真面目に指定してんのに、この仕打である(´・ω・`)。みんなW3Cを見に行って慢性的な高負荷状態になってるのが原因らしいが、まぁ当然そうなりますわな…。 
 + 
 +コードにすると↓な感じ。
  
 <code csharp> <code csharp>
 XmlDocument doc = new XmlDocument(); 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); /ここで例外+XmlDocumentType docType = doc.CreateDocumentType( 
 + "HTML", 
 + "-//W3C//DTD HTML 4.01 Frameset//EN", 
 + "https://www.w3.org/TR/html401/frameset.dtd", 
 + null); /ここでエラー */
 </code> </code>
  
行 15: 行 21:
 XmlDocument doc = new XmlDocument(); XmlDocument doc = new XmlDocument();
 doc.Resolver = null; // 追加 doc.Resolver = null; // 追加
-XmlDocumentType docType = doc.CreateDocumentType("HTML","-//W3C//DTD HTML 4.01 Frameset//EN", "https://www.w3.org/TR/html401/frameset.dtd", null); /エラーにならない+XmlDocumentType docType = doc.CreateDocumentType( 
 + "HTML", 
 + "-//W3C//DTD HTML 4.01 Frameset//EN", 
 + "https://www.w3.org/TR/html401/frameset.dtd", 
 + null); /エラーにならない */
 </code> </code>
  
 ・・・と、ここまで書いて思ったが、これで回避できるって事は自前実装したXMLリゾルバでDTD返してやればいいだけなんじゃね? ・・・と、ここまで書いて思ったが、これで回避できるって事は自前実装したXMLリゾルバでDTD返してやればいいだけなんじゃね?
 +
 +===== 2016-04-13追記 =====
 +
 +といわけで[[2016-04-13|ローカルのDTDを使うリゾルバを作った]]。
  • blog/2016/2016-02-24.1456303445.txt.gz
  • 最終更新: 2016-02-24 17:44
  • by Decomo