【问题标题】:Web Service Throwing ExceptionWeb 服务抛出异常
【发布时间】:2013-06-19 15:53:43
【问题描述】:

我在实现 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

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

【问题讨论】:

    标签: .net web-services sharepoint soap


    【解决方案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);
        }
    

    【讨论】:

    【解决方案2】:

    我必须查看更多代码才能更好地了解哪些方法是你的等等,但乍一看我可以看到你正在将一些 nulls 传递到服务的 GetListItems方法。虽然这可能完全是无辜的,但如果您可以访问它,我会查看服务的代码/文档,看看它是否期望实际值而不是 null

    附带说明,如果您是创建该服务的人,我会尝试以一种无需手动构建 XML 查询的方式来创建它。我会尝试制作一个 WCF 服务,它提供的方法可以以最少的麻烦来完成您想要的事情。

    【讨论】:

    • 我没有创建 Web 服务,这是 SharePoint Web 服务 API 的一部分。我不相信传入空值是一个问题,因为它在 MSDN 文档中是这样做的:msdn.microsoft.com/en-us/library/…
    • 啊,我明白了...我很惊讶 MS 建议手动操作 XML 字符串只是为了访问服务...这太不雅了。也就是说,我不知道您的代码发生了什么……我唯一的其他建议是,如果可以的话,也许检查一下 SharePoint 服务器上的日志。
    • 不幸的是,我也没有直接访问 SharePoint 服务器的权限。如果我这样做了,我就不会使用网络服务。感谢您的帮助。
    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-03-06
      • 1970-01-01
      • 2017-06-15
      • 1970-01-01
      • 1970-01-01
      • 2012-03-11
      • 2010-09-16
      • 1970-01-01
      相关资源
      最近更新 更多