1

我很难实现 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

有人对此有任何想法吗?除了堆栈跟踪,异常的属性几乎都是空的。我以前从未做过 SOAP,所以这对我来说真的很新鲜。非常感谢任何帮助。

4

3 回答 3

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);
    }
于 2013-11-05T13:09:03.653 回答
0

我必须查看更多代码才能更好地了解您的方法等等,但乍一看,我可以看到您正在将几个nulls 传递到服务的GetListItems方法中。虽然这可能是完全无辜的,但如果您可以访问它,我会查看服务的代码/文档,看看它是否期望实际值而不是null.

附带说明一下,如果您是创建该服务的人,我会尝试以一种无需手动构建 XML 查询的方式来实现它。我会尝试制作一个 WCF 服务,该服务提供的方法可以以最少的麻烦来完成您想要的事情。

于 2013-06-19T16:05:45.377 回答
0

再想想,你可能会因为 where 子句而受苦。即,几乎可以保证字段名不能与空格一起使用。(FieldRef Name 属性需要字段的内部名称)

获取SharePoint Caml 查询助手的副本,这将允许您确保值正确并返回数据。

于 2013-06-20T22:37:54.287 回答