Web服务抛出异常

时间:2013-06-19 15:53:44

标签: .net web-services sharepoint soap

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

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

3 个答案:

答案 0 :(得分: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);
    }

答案 1 :(得分:0)

我必须看到更多的代码才能更好地了解哪些方法属于您自己等等,但乍一看我可以看到您将几个null传入服务{ {1}}方法。虽然这可能是完全无辜的,但如果您可以访问它并查看它是否期望实际值而不是GetListItems,我会查看该服务的代码/文档。

作为旁注,如果您是创建服务的人,我会尝试以一种我不必手动构建XML查询的方式来创建服务。我会尝试创建一个WCF服务,提供方法来完成你想要的东西,并且头痛最少。

答案 2 :(得分:0)

在第二个问题上,你可能因为where子句而受苦。即fieldname几乎可以保证不与空间一起使用。 (FieldRef Name属性需要字段的内部名称)

获取SharePoint Caml Query Helper的副本,这样可以确保值正确并返回数据。