求助:C#无服务引用获取SharePoint列表视图数据及SSIS重定向问题
兄弟,你现在的代码其实只是请求了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
相关产品推荐
相关产品推荐

