2013-06-19 190 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