我很难实现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:\users\user\documents\visual studio 2010\Projects\DLAUpdateSP\Web References\SoapService\Reference.cs:line 455
at DLAUpdateSP.Program.UpdateSuppliers(String fileLocation) in C:\Users\user\Documents\Visual Studio 2010\Projects\DLAUpdateSP\Program.cs:line 58
有没有人对此有任何想法?除了堆栈跟踪之外,异常的属性几乎都是null。我之前从未做过SOAP,所以这对我来说真的很新。任何帮助都非常感谢。
答案 0 :(得分:1)
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);
}
答案 1 :(得分:0)
我必须看到更多的代码才能更好地了解哪些方法属于您自己等等,但乍一看我可以看到您将几个null
传入服务{ {1}}方法。虽然这可能是完全无辜的,但如果您可以访问它并查看它是否期望实际值而不是GetListItems
,我会查看该服务的代码/文档。
作为旁注,如果您是创建服务的人,我会尝试以一种我不必手动构建XML查询的方式来创建服务。我会尝试创建一个WCF服务,提供方法来完成你想要的东西,并且头痛最少。
答案 2 :(得分:0)
在第二个问题上,你可能因为where子句而受苦。即fieldname几乎可以保证不与空间一起使用。 (FieldRef Name属性需要字段的内部名称)
获取SharePoint Caml Query Helper的副本,这样可以确保值正确并返回数据。