摘要:在Thread pooling for web connections中我曾经提到Shared Source CLI,这次再借用另一个场合宣传一下这个"Open Source .NET Framework"吧。
Topic还是web connection pooling:可以很自然地想到我们可以设计这么一个class:
class WebConnector
{
WebRequest CreateRequest(string targetUrl)
{
return WebRequest.Create(targetUrl);
}
...
}
这个class现在什么都没有做,因为我们的希望是.NET提供的WebRequest可以提供一定的pooling mechanism,如果真是那样,那生活真是很美好,我们什么都不要做就可以下班了。而其实这也不是什么太wild的dream,毕竟是.NET,连个pooling都不提供,也不要混了。
在深入研究一下WebRequest class之前,我们还需要考虑一个问题:web application很常见的会用到其他的web service,也就是用SOAP像其他web service请求服务。在Visual Studio中如何生成web service的proxy class等等我就不用重复重复了吧(wsdl.exe等等的)?关键在于:这个由wsdl自动生成proxy class用的是什么connection mechanism呢?虽然基本可以想到应该也是somewhere, somehow用的WebRequest,但还是让我们double check一下。找任意一份wsdl生成的proxy class的代码看看:
public partial class WSProxcyClass : System.Web.Services.Protocols.SoapHttpClientProtocol
嗯,看来基本功能都在SoapHttpClientProtocol这个类里面。
再研究一下MSDN里SoapHttpClientProtocol的API,aha,有这么一个member function:
protected override WebRequest GetWebRequest(Uri uri)
看来所有SoapHttpClientProtocol里面用到的WebRequest都是通过这个函数来取得的。注意一下前缀的override关键字,很好很好,这说明如果我们对WebRequest现有的pooling mechanism不满意的话(或者WebRequest根本没有提供pooling机制),我们可以从SoapHttpClientProtocol派生一个类,然后改写掉GetWebRequest来实现我们满意的pooling机制。其他的接口都还是用SoapHttpClientProtocol,而WSProxyClass只要继承新的派生类就可以了。
嗯,很好,至少我们有了backup plan,虽然麻烦了一点点,但也算不错,感谢SoapHttpClientProtocol良好的界面。
现在该进一步了,我们来研究一下WebRequest到底有没有提供pooling吧。
(题外话:可以看到.NET源代码的朋友可以研究一下SoapHttpClientProtocol的实现,这里是一个class hierarchy:
WebClientProtocol
-> HttpWebClientProtocol
-> SoapHttpClientProtocol : 你会发现,GetWebRequest其实一直延伸到最基类的WebClientProtocol里,有不少messy stuff to deal with,所以真的要改写GetWebRequest并非那么容易。不过,anyway, that's a side note to this article, we are heading for better stuff, baby.
)
这下该用到,搜一下webrequest.cs,嗯嗯,time to read the source code:
private static WebRequest Create(Uri requestUri, bool useUriBase) {
string LookupUri; WebRequestPrefixElement Current = null; bool Found = false;
if (!useUriBase) { LookupUri = requestUri.AbsoluteUri; } else { ......[
阅读全文]