| 著作一覧 |
とは到底思えない日が続くので、気分はまだ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で作り直すようにコードしているわけだから、仮にうまく動いてもこれは変だと思う。
ジェズイットを見習え |