著作一覧 |
とは到底思えない日が続くので、気分はまだ6月。しかし、着々とその日は近づくのであった。
public class GeneratedSpecialized : SoapHttpClientProtocol { ... } ... for (;;) { using (GeneratedSpecialized s = new Specialized()) { s.Url = "http://...."; s.WebMethod(); } // 暗黙にs.Dispose()が呼び出される。 Thread.Sleep(300); // 相手IISのセッションタイムアウト時間 }とした場合、相手からのRSTを受けているにもかかわらず、同一ソケットを利用して2度目のリクエストを出している。
public class ProxyProxy : GeneratedSpecialized { protected override WebRequest* GetWebRequest(Url u) { return WebRequest.Create(u); // 常に作り直し } }うまく行くだろうなぁ、と思うが、なんだかなぁ、という感じ。
************** 例外テキスト ************** System.InvalidOperationException: XML ドキュメントを生成中にエラーが発生しました。 ---> System.InvalidCastException: 指定されたキャストは有効ではありません。 at Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationWriter1.Write13_Register(Object[] p) --- 内部例外スタック トレースの終わり --- at System.Xml.Serialization.XmlSerializer.Serialize(XmlWriter xmlWriter, Object o, XmlSerializerNamespaces namespaces, String encodingStyle)Flag属性enumとは関係ないようだ。なんでだ?
protected override WebRequest GetWebRequest(Uri uri) { HttpWebRequest wr = (HttpWebRequest)WebRequest.Create(uri); if (last) // 連続してリクエストを出す場合、最後のリクエストのみ設定 { wr.KeepAlive = false; } return wr; }結局、まともにHTTPと付き合う必要がある。ちなみに、HttpWebRequest#Connectionに対して"Close"を代入すると例外になる(MSDNに明記されている)ので、KeepAliveプロパティを利用する。
わかった。と思う。バッファリングの最中に、シリアライゼーションが完了したと思って、誤って送信してしまうからだ。Content-Lengthが良く見るとおかしい。
その結果、500なレスポンスがHTMLで戻ってくるから、デシリアライゼーションに失敗しているというのが、InvalidCastExceptionなんだろう。
試す気は無いが、LifeTimeServiceのデフォルトの有効期間が5分らしいので、これで引き伸ばすというテもあるようだ。
でも、この場合、SoapClientProxy自体をdisposeしてnewで作り直すようにコードしているわけだから、仮にうまく動いてもこれは変だと思う。
ジェズイットを見習え |