2013-06-19 4 views
1

У меня трудное время для внедрения клиента веб-сервиса. Я запрашиваю веб-службу SharePoint 2010 с помощью веб-ссылки. Код ниже выдает исключение в строке в блоке 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 раньше, так что это действительно ново для меня. Любая помощь действительно ценится.

ответ

0

Мне нужно будет увидеть больше кода, чтобы лучше понять, какие методы принадлежат вам и тому подобное, но на первый взгляд я вижу, что вы передаете несколько null s в метод GetListItems службы. Хотя это может быть совершенно невинно, я бы посмотрел код/​​документацию службы, если вы можете получить к нему доступ, и посмотреть, ожидаются ли они фактические значения, а не null.

В качестве побочного примечания, если вы тот, кто создал службу, я постараюсь сделать это так, чтобы мне не пришлось вручную создавать XML-запросы. Я бы попытался сделать службу WCF, которая предоставляет методы для достижения того, чего вы хотите с минимальными головными болями.

+0

Я не создавал веб-службы, это является частью API веб-служб SharePoint. Я не думаю, что передача в nulls является проблемой, учитывая, что это делается в документации MSDN: http://msdn.microsoft.com/en-us/library/lists.lists.getlistitems(v=office.12) .aspx – Nathan

+0

А я вижу ... Я удивлен, что MS рекомендует ручную манипуляцию строками XML только для доступа к сервису ... это просто так неэлегантно. Тем не менее, я понятия не имею, что происходит с вашим кодом ... мой единственный совет - возможно, проверить журнал на сервере SharePoint, если сможете. – derekmckinnon

+0

К сожалению, у меня нет прямого доступа к серверам SharePoint. Если бы я это сделал, я бы не использовал веб-службу. Спасибо за помощь. – Nathan

0

На вторых, возможно, вы страдаете из-за предложения where. То есть имя поля почти гарантированно не работает с пробелом. (Для атрибута FieldRef Name требуется внутреннее название поля)

Получить копию 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

Помните, что пробелы в именах полей часто преобразуются в '_x0020_' http://sharepoint.stackexchange.com/questions/787/finding-the-internal-name-and-display-name-for-a-list- колонка – Nat

Смежные вопросы