我很难实现一个web服务客户端。我正在使用web引用查询SharePoint 2010 web服务。下面的代码在try块内的那一行抛出一个异常。
SoapService.Lists service = new SoapService.Lists();
service.Credentials = CredentialCache.DefaultCredentials;
XmlDocument doc = new XmlDocument();
XmlNode query = doc.CreateNode(XmlNodeType.Element,"Query","");
XmlNode viewFields = doc.CreateNode(XmlNodeType.Element,"ViewFields","");
XmlNode queryOptions = doc.CreateNode(XmlNodeType.Element,"QueryOptions","");
query.InnerXml = @"<Where><IsNotNull><FieldRef Name='Vendor Name'/></IsNotNull></Where>";
viewFields.InnerXml = @"<FieldRef Name='Vendor Name'/>";
queryOptions.InnerXml = @"<QueryOptions/>";
try
{
XmlNode response = service.GetListItems("DLA-Suppliers", null, query, viewFields, null, queryOptions, null); // exception thrown
}
catch (System.Web.Services.Protocols.SoapException e)
{
Console.WriteLine(e.Message);
Console.WriteLine(e.Detail);
Console.WriteLine(e.StackTrace);
}
下面是异常(SoapServerException)堆栈跟踪:
at System.Web.Services.Protocols.SoapHttpClientProtocol.ReadResponse(SoapClientMessage message, WebResponse response, Stream responseStream, Boolean asyncCall)
at System.Web.Services.Protocols.SoapHttpClientProtocol.Invoke(String methodName, Object[] parameters)
at DLAUpdateSP.SoapService.Lists.GetListItems(String listName, String viewName, XmlNode query, XmlNode viewFields, String rowLimit, XmlNode queryOptions, String webID) in c:usersuserdocumentsvisual studio 2010ProjectsDLAUpdateSPWeb ReferencesSoapServiceReference.cs:line 455
at DLAUpdateSP.Program.UpdateSuppliers(String fileLocation) in C:UsersuserDocumentsVisual Studio 2010ProjectsDLAUpdateSPProgram.cs:line 58
有人对此有什么想法吗?除了堆栈跟踪之外,异常的属性几乎都为空。我以前从来没有做过SOAP,所以这对我来说真的很新鲜。
query.InnerXml = @"<Where><IsNotNull><FieldRef Name='Vendor Name'/></IsNotNull></Where>";
viewFields.InnerXml = @"<FieldRef Name='Vendor Name'/>";
问题是您的FieldRef名称。我有同样的问题,并使用可以在您的列表浏览器URL中找到的内部名称解决了它。可能是VendorName(不带空格)。
按如下方式修改代码
SoapService.Lists service = new SoapService.Lists();
service.Credentials = CredentialCache.DefaultCredentials;
XmlDocument doc = new XmlDocument();
XmlNode query = doc.CreateNode(XmlNodeType.Element,"Query","");
XmlNode viewFields = doc.CreateNode(XmlNodeType.Element,"ViewFields","");
XmlNode queryOptions = doc.CreateNode(XmlNodeType.Element,"QueryOptions","");
query.InnerXml = @"<Where><IsNotNull><FieldRef Name='VendorName'/></IsNotNull> </Where>";
viewFields.InnerXml = @"<FieldRef Name='VendorName'/>";
queryOptions.InnerXml = @"<QueryOptions/>";
try
{
XmlNode response = service.GetListItems("DLA-Suppliers", null, query, viewFields, null, queryOptions, null); // exception thrown
}
catch (System.Web.Services.Protocols.SoapException e)
{
Console.WriteLine(e.Message);
Console.WriteLine(e.Detail);
Console.WriteLine(e.StackTrace);
}
我必须看更多的代码才能更好地了解哪些方法是您的,但是第一眼我可以看到您正在将一些null
传递到服务的GetListItems
方法中。虽然这可能是完全无辜的,但如果你可以访问它,我会看看服务的代码/文档,看看它是否期望实际值而不是null
。
作为旁注,如果您是创建服务的人,我会尝试以一种不必手动构建XML查询的方式来创建它。我会尝试做一个WCF服务,提供方法来完成你想要的东西,并且最少的头痛。
仔细想想,您可能会因为where子句而感到苦恼。也就是说,字段名几乎可以保证不与空格一起工作。(FieldRef Name属性需要字段的内部名称)
获取SharePoint Caml查询助手的副本,这将允许您确保值是正确的,数据将返回