2013-06-19 44 views
1

我很难实现Web服务客户端。我正在使用Web引用查询SharePoint 2010 Web服务。下面的代码在try块内的行上引发异常。Web服务抛出异常

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,所以这对我来说真的很新鲜。任何帮助真的很感激。

回答

0

我不得不看更多的代码才能更好地了解哪些方法是你的,但乍一看我可以看到,你正在将几个null传入服务的方法GetListItems。虽然这可能是完全无辜的,但如果您可以访问该服务的代码/文档,并查看它是否期待实际值而不是null,那么我会查看该服务的代码/文档。作为一个侧面说明,如果你是创建服务的人,我会尽力使它不会手动构建XML查询。我会尝试做一个WCF服务,提供方法以最小的麻烦完成你想要的东西。

+0

我没有创建Web服务,这是SharePoint Web服务API的一部分。我不相信传入空值是一个问题,因为它是在MSDN文档中完成的:http://msdn.microsoft.com/en-us/library/lists.lists.getlistitems(v=office.12) .aspx – Nathan

+0

啊,我看到了...我很惊讶MS建议手动操纵XML字符串来访问一个服务......它太不雅观了。也就是说,我不知道你的代码发生了什么......我唯一的其他建议是,如果可以的话,可能检查SharePoint服务器上的日志。 – derekmckinnon

+0

不幸的是我没有直接访问SharePoint服务器。如果我这样做,我不会使用Web服务。谢谢您的帮助。 – Nathan

0

第二个虽然,你可能会因为where子句而受苦。即字段名几乎可以保证不与空间一起工作。 (FieldRef名称属性需要字段的内部名称)

获取SharePoint Caml Query Helper的副本,这将允许您确保值是正确的并且将返回数据。

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); 
    } 
+0

请记住,字段名称中的空格通常会转换为_sharepoint.stackexchange.com/questions/787/finding-the-internal-name-and-display-name-for-a-list-柱 – Nat