【问题标题】:is there anyway to have dynamic web service reference?反正有动态Web服务参考吗?
【发布时间】:2010-12-19 15:32:36
【问题描述】:

我的目标是连接到共享点列表并将数据下载到数据表中。我可以很好地做到这一点,但是以一种非常“硬编码”的方式,因为我必须在 Visual Studio 中手动在项目中添加 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 属性(所以你认为它会起作用)但它没有除非设置了所有其他配置和引用,否则似乎无法正常工作。有没有办法在不需要所有这些 Visual Studio 自动生成的配置驱动代码的情况下做到这一点?

【问题讨论】:

  • 你使用的是 moss 还是 sharepoint 2010

标签: c# web-services sharepoint list


【解决方案1】:

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

【讨论】:

  • @John Saunders:仅供参考...Lists 对象没有任何额外的构造函数来设置 URL。但是,设置 URL 属性将正常工作。
  • @Kit:那么我猜你正在使用 Web Reference。服务引用具有接受端点引用的构造函数。
  • @Kit:你应该尽快停止使用网络引用
  • 我认为通常我们生成 WSDL 代理文件而不是使用 Web 引用。为什么我们不应该使用网络参考?
  • @Kit:因为它们是微软现在认为是“遗留软件”的旧“ASMX”技术的一部分。除非别无选择,否则请使用 WCF。
【解决方案2】:

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

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

还有米格尔·卡斯特罗的这篇文章:WCF the Manual Way… the Right Way

前路艰难,祝你好运:)

【讨论】:

    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

      我曾经历过类似的情况来调用 SharePoint webservice 并根据所选站点获取不同列表的数据。

      我的方法是将站点 url 和凭据存储在 xml 文件中。 拥有它后,您可以动态传递站点 url,如下所示。

      您可以创建一个函数并传递所需的参数,例如 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);
      

      希望这会有所帮助。

      如果您有任何疑问,请告诉我。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-01-10
        • 2014-07-19
        • 2010-11-15
        • 2010-11-06
        • 1970-01-01
        相关资源
        最近更新 更多