You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求助:C#无服务引用获取SharePoint列表视图数据及SSIS重定向问题

解决SharePoint Lists.asmx获取数据的问题

兄弟,你现在的代码其实只是请求了Lists.asmx的WSDL描述页面,根本没调用实际的Web服务方法来拿列表数据——这就是为啥你看不到列名和内容的原因!Lists.asmx是SOAP类型的Web服务,必须通过发送规范的SOAP请求,调用它的GetListItems方法才能获取指定视图的列表内容。下面给你具体的解决思路:

1. 正确构造SOAP请求调用GetListItems

你需要把请求改成POST方式,带上符合SharePoint要求的SOAP信封,指定列表名、视图名这些参数。直接给你可复用的代码示例:

string serviceURL = "https://xxxxx/_vti_bin/Lists.asmx";
string targetList = "你的目标列表名称";
string targetView = "要使用的视图名称"; // 也可以用视图的GUID,格式是{XXXX-XXXX-XXXX}

// 构造符合SharePoint SOAP规范的请求体
string soapRequest = $@"<?xml version=""1.0"" encoding=""utf-8""?>
<soap:Envelope xmlns:xsi=""http://www.w3.org/2001/XMLSchema-instance"" xmlns:xsd=""http://www.w3.org/2001/XMLSchema"" xmlns:soap=""http://schemas.xmlsoap.org/soap/envelope/"">
  <soap:Body>
    <GetListItems xmlns=""http://schemas.microsoft.com/sharepoint/soap/"">
      <listName>{targetList}</listName>
      <viewName>{targetView}</viewName>
    </GetListItems>
  </soap:Body>
</soap:Envelope>";

HttpWebRequest req = (HttpWebRequest)WebRequest.Create(serviceURL);
req.UseDefaultCredentials = true;
req.PreAuthenticate = true;
req.Credentials = CredentialCache.DefaultCredentials;
req.CookieContainer = new CookieContainer();
req.AllowAutoRedirect = false;
// 关键:改成POST,设置正确的ContentType和SOAPAction头
req.Method = "POST";
req.ContentType = "text/xml; charset=utf-8";
req.Headers.Add("SOAPAction", "\"http://schemas.microsoft.com/sharepoint/soap/GetListItems\"");

// 把SOAP请求体写入流
using (StreamWriter sw = new StreamWriter(req.GetRequestStream()))
{
    sw.Write(soapRequest);
}

// 获取并解析响应
using (HttpWebResponse resp = (HttpWebResponse)req.GetResponse())
{
    using (StreamReader sr = new StreamReader(resp.GetResponseStream(), Encoding.UTF8))
    {
        string rawXml = sr.ReadToEnd();
        // 这里的rawXml就是包含所有列表数据的XML,你可以用XmlDocument或XDocument解析它
        // 比如提取z:row节点里的ows_开头的属性,就是列名和对应的值
    }
}

注意点:

  • 替换targetList和targetView为你的实际值,不知道视图名的话可以留空,或者用视图的GUID(记得加大括号)
  • SOAPAction头必须完全匹配上面的内容,少一个引号都可能报错

2. 处理重定向和认证的坑

你已经关闭了自动重定向,但如果服务返回302状态码,得手动处理:

  • 先判断resp.StatusCode是不是HttpStatusCode.Redirect或HttpStatusCode.Found
  • 提取响应头里的Location字段,用这个新URL重新发请求,而且要复用之前的CookieContainer(不然认证状态会丢)

如果遇到认证失败,可以试试强制用NTLM认证:

req.Credentials = new NetworkCredential("你的用户名", "密码", "域名");
req.AuthenticationLevel = System.Net.Security.AuthenticationLevel.MutualAuthRequested;

3. 在SSIS里集成的小技巧

要是想把这个逻辑放到SSIS里,推荐这么做:

  • 用脚本任务执行上面的代码,解析XML后把数据写到临时表,或者直接生成DataTable输出到数据流
  • 如果要把XML转成行集,可以用XDocument遍历z:row节点,把每个节点的属性(ows_列名)转成DataTable的列和行,再通过SSIS的IDTSOutputCollection输出

4. 排查之前Web Service方案失败的原因

你说之前用Web Service方案失败,大概率是这几个原因:

  • 没正确添加Web引用:要在项目里添加Lists.asmx的Web引用,生成代理类才能调用方法
  • 认证没配置对:代理类要设置UseDefaultCredentials = true,或者手动传入域账号密码
  • 重定向搞砸了:代理类默认会自动重定向,你可以在代理类的构造函数里设置AllowAutoRedirect = false,手动处理重定向路径

内容的提问来源于stack exchange,提问作者Cascador84

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 22:42:29