最近想制作一个类库封装所有对SharePoint的外部调用。webservice是其中的一部分。
为了大小通吃2003和2007,我选择了两个典型的sharepoint server站点。
我选择了WCF作为沟通平台。
引用2003的webvservice很顺利,感受到IDE很好很强大,省去了很多敲打命令行的麻烦。
接来的2007就形成了很大的反差。其中看到了ms的代码生成器的一些bug,因为这些bug,我不得不面对一长串的errors,不得不找原因。
partial class是罪魁祸首,errors是由大量的重复类型,属性声明,叠加生成的,为此花了大量的时间修剪生成的6万多行代码,cpu满负荷,内存大量占用,resharper罢工(有待改进分析器),不得不暂时在addin中卸载它,终于顺利通过。以前没有碰到这样的问题是应为都是加载一类的操作,比如LISTS。这次包括了26个services,见下图。Discovery地址也和2003有所不同。
下面代码简单的用代码方式而不是基于声明的配置来初始化一个请求,并返回LISTS集合。
public void Test()
{
var basicHttpBinding = new BasicHttpBinding();
basicHttpBinding.Security.Mode = BasicHttpSecurityMode.TransportCredentialOnly;
basicHttpBinding.Security.Transport.ClientCredentialType = HttpClientCredentialType.Ntlm;
basicHttpBinding.MaxReceivedMessageSize = int.MaxValue;
basicHttpBinding.ReaderQuotas.MaxBytesPerRead = int.MaxValue;
var lists = new ListsSoapClient(basicHttpBinding, new EndpointAddress(http://_vti_bin/lists.asmx));
lists.ClientCredentials.Windows.ClientCredential = CredentialCache.DefaultNetworkCredentials;
var collection = lists.GetListCollection(); //breakpoint
}
{
var basicHttpBinding = new BasicHttpBinding();
basicHttpBinding.Security.Mode = BasicHttpSecurityMode.TransportCredentialOnly;
basicHttpBinding.Security.Transport.ClientCredentialType = HttpClientCredentialType.Ntlm;
basicHttpBinding.MaxReceivedMessageSize = int.MaxValue;
basicHttpBinding.ReaderQuotas.MaxBytesPerRead = int.MaxValue;
var lists = new ListsSoapClient(basicHttpBinding, new EndpointAddress(http://_vti_bin/lists.asmx));
lists.ClientCredentials.Windows.ClientCredential = CredentialCache.DefaultNetworkCredentials;
var collection = lists.GetListCollection(); //breakpoint
}
先写到这里.