反正有没有动态Web服务参考?

时间:2010-12-19 15:32:37

标签: c# web-services sharepoint list

我的目标是连接到sharepoint列表并将数据下载到数据表中。我可以做到这一点很好但是一个非常“硬编码”的方式,因为我必须手动,在视觉工作室内,在项目上添加一个Web引用。例如,如果我想指向这样的东西:

http://www.ab.com/sites/SiteCollections/MyTeam/_vti_bin/dspsts.asmx

http://www.abc.com/sites/MyTeam/_vti_bin/Lists.asmx

(只是显示格式的虚拟URL)。

我必须在Visual Studio中创建一个Web服务引用。这会生成一堆代码(Reference.cs),并在我的项目和app.config中创建一个Web引用部分,现在我可以使用此代码:

  com.mysite.Lists lists = new Lists();
  lists.Credentials = new System.Net.NetworkCredential(user, pwd, "CORP");
  lists.Url = "http://www.abc.com/sites/MyTeam/_vti_bin/Lists.asmx";

  XmlNode ndQuery = xmlDoc.CreateNode(XmlNodeType.Element, "Query", "");
  XmlNode ndViewFields = xmlDoc.CreateNode(XmlNodeType.Element, "ViewFields", "");
  XmlNode ndQueryOptions = xmlDoc.CreateNode(XmlNodeType.Element, "QueryOptions", "");

  XmlNode listitems = lists.GetListItems(sharepointList, null, ndQuery, ndViewFields, "1000",
                                               ndQueryOptions, null);

无论如何,我可以在外部获取一个URL,并且无需创建所有这些手动更新和配置更新即可使用此代码。

我想把这段代码放到一个库中,这样人们就可以拿一个URL并传入它。有趣的是,如果你在上面看它们是一个URL属性(所以你认为它会起作用)但它没有除非设置了所有其他配置和引用,否则似乎工作正常。反正有没有完全不需要所有这个视觉工作室自动生成的配置驱动代码?

4 个答案:

答案 0 :(得分:6)

如果您的问题是您需要为每个列表提供新的服务参考,那么它已经解决了。只要所有List.asmx服务具有相同的WSDL,您就不需要为每个服务引用新的服务引用。您可以使用单个服务引用,只使用带有端点地址(Url)的构造函数重载。

答案 1 :(得分:0)

你可以看一下微软的Michele Leroux Bustamante撰写的这篇有趣的文章:Building a WCF Router, Part 1

路由器必须是动态的并且适应所有合同,因此这将是一个很好的起点。

Miguel Castro也有这篇文章:WCF the Manual Way… the Right Way

艰难的道路啊,祝你好运:)。

答案 2 :(得分:0)

创建动态客户端的最低级别方法是新的ChannelFactory()。CreateChannel(绑定,地址),从XML构造Message对象,在通道上调用Request()方法,然后处理返回的XML消息。如果您可以进一步指定您正在调用的Web服务的动态,那么它可以变得更加简单。实际上,Sharepoint网站的Lists.asmx中有什么动态吗?我的意思是,方法或数据类型是否因安装而异?

答案 3 :(得分:0)

我已经通过类似的情况调用SharePoint Web服务并根据所选站点获取不同列表的数据。

我的方法是将网站网址和凭据存储在xml文件中。 获得后,您可以动态传递网站网址,如下所示。

您可以创建一个函数并传递必需的参数,如SiteURL,DocLibName,ListID等。

function GetListData(String SiteURL, string DocLibName, string ListId)
com.mysite.Lists lists = new Lists()
{

lists.Credentials = new System.Net.NetworkCredential(user, pwd, "CORP");

lists.Url = SiteURL +/_vti_bin/Lists.asmx";
XmlNode ndQuery = xmlDoc.CreateNode(XmlNodeType.Element, "Query", "");
XmlNode ndViewFields = xmlDoc.CreateNode(XmlNodeType.Element, "ViewFields", "");
XmlNode ndQueryOptions = xmlDoc.CreateNode(XmlNodeType.Element, "QueryOptions", "");

XmlNode listitems = lists.GetListItems(DocLibName, null, ndQuery, ndViewFields, "1000",
                                               ndQueryOptions, null);

}

一旦你在XMLNode中拥有它,你就可以在数据集中获取它。

DataSet dsXML=new DataSet(); 
dsXML.LoadXml(node.OuterXml);

希望这会有所帮助。

如果您有任何疑问,请与我们联系。