Web服务抛出异常



我很难实现一个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查询助手的副本,这将允许您确保值是正确的,数据将返回

最新更新