Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/383.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何从SiteData.asmx web服务(SharePoint 2010)调用GetChanges()方法?_C#_Java_Web Services_Sharepoint 2010_Sharepoint 2007 - Fatal编程技术网

C# 如何从SiteData.asmx web服务(SharePoint 2010)调用GetChanges()方法?

C# 如何从SiteData.asmx web服务(SharePoint 2010)调用GetChanges()方法?,c#,java,web-services,sharepoint-2010,sharepoint-2007,C#,Java,Web Services,Sharepoint 2010,Sharepoint 2007,我正在尝试从Java应用程序运行GetChanges方法(sitedata.asmx)。但是,我无法找出必须传递的正确参数。这是针对SharePoint 2010的 通过检查,我看到以下是所需的参数: 对象类型:更改跟踪空间 报道 “ContentDatabase”或“SiteCollection”。 所有其他objectType值,如 第2.2.5.3节中定义的,不得 被使用。请注意,在 这个参数的上下文实际上是 指网站集 contentDatabaseId:内容的GUID 预先知道或获得的数

我正在尝试从Java应用程序运行GetChanges方法(sitedata.asmx)。但是,我无法找出必须传递的正确参数。这是针对SharePoint 2010的

通过检查,我看到以下是所需的参数:

对象类型:更改跟踪空间 报道 “ContentDatabase”或“SiteCollection”。 所有其他objectType值,如 第2.2.5.3节中定义的,不得 被使用。请注意,在 这个参数的上下文实际上是 指网站集

contentDatabaseId:内容的GUID 预先知道或获得的数据库 通过GetContent请求

LastChangeId:指定起点的标记 获取请求的更改报告。 通常,协议客户端获得 此值来自对 上一个GetContent或GetChanges操作

CurrentChangeId:指定 请求的更改的终结点 汇报如果不为空,则为CurrentChangeId 必须是从中获取的有效令牌 对前一个GetChanges的响应 活动通常,此元素是 空的empty指定 协议客户端请求所有更改 从起点到终点 现在

超时:一个值 这决定了有多少变化 应在当前 活动此值必须更大 大于0,并且协议服务器必须 仅获取所做更改总数的x% 默认情况下获取,其中x为 (超时除以30000)

协议客户端必须传递 与变更跟踪相对应 由objectType和 SOAP请求的目标URL

我要发送的消息中的SOAP如下所示:

<?xml version='1.0' encoding='UTF-8'?>
<soapenv:Envelope xmlns:soapenv="http://www.w3.org/2003/05/soap-envelope">
    <soapenv:Body>
        <ns1:GetChanges xmlns:ns1="http://schemas.microsoft.com/sharepoint/soap/">
            <ns1:objectType>SiteCollection</ns1:objectType>
            <ns1:contentDatabaseId>E5C5E20A-5A9F-406C-B9F6-28923750CECD</ns1:contentDatabaseId>
            <ns1:startChangeId>1;0;E5C5E20A-5A9F-406C-B9F6-28923750CECD;634438121498470000;46852</ns1:startChangeId>
            <ns1:Timeout>0</ns1:Timeout>
        </ns1:GetChanges>
    </soapenv:Body>
</soapenv:Envelope>
但是,我找不到该错误的任何引用。我甚至无法从SPChangeToken类()中找到ParseChangeToken方法,因此这很容易混淆

我已经看到了这个问题,但这并不能解决我的问题:

有人能帮我正确调用此web服务吗

编辑

尝试从C#应用程序调用它,以确定问题不在于Java。代码如下:

SiteData.SiteDataSoapClient siteDataService = new SiteData.SiteDataSoapClient();
siteDataService.Endpoint.Address = new System.ServiceModel.EndpointAddress("URL/_vti_bin/sitedata.asmx");
siteDataService.ClientCredentials.Windows.ClientCredential = new System.Net.NetworkCredential("username", "password", "domain");
siteDataService.ClientCredentials.Windows.AllowedImpersonationLevel = System.Security.Principal.TokenImpersonationLevel.Impersonation;

String startChangeId = "1;1;69d025ce-96a7-4131-adc0-7da1603e8d24;634439002539570000;46914";
String endChangeId = "";
bool hasMoreChanges = false;
String databaseID = E5C5E20A-5A9F-406C-B9F6-28923750CECD; //Got it by querying SharePoint database. Any idea how to get it programatically?
String result = siteDataService.GetChanges(SiteData.ObjectType.SiteCollection, databaseID, ref startChangeId, ref endChangeId, 0, out hasMoreChanges);
return result;
但是,我得到了“Microsoft.SharePoint.SoapServer.SoapServerException”,此异常的详细信息为空。用于监视SharePoint服务器返回的XML,并发现相同的“对象引用未设置为对象实例”异常

这当然意味着我传递的参数有问题,对吗

谢谢

编辑


如果有人感兴趣,我也通过在XML消息中将StartChangeId设置为LastChangeId,将EndChangeId设置为CurrentChangeId来实现这一点。

解决了这个问题。通过查看SharePoint日志,我注意到以下几行:

06/20/2011 08:24:03.80  w3wp.exe (0x1C2C)                           0x0CAC  SharePoint Foundation           General                         fbs6    Medium      <?xml version="1.0" ?><S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/"><S:Body><GetChanges xmlns="http://schemas.microsoft.com/sharepoint/soap/"><objectType>SiteCollection</objectType><contentDatabaseId>{E5C5E20X-5A9F-406C-B9F6-28923750CECD}</contentDatabaseId><startChangeId></startChangeId><endChangeId>1;1;69c025ce-96a7-4131-adc0-7da1603e8d24;634439772069030000;47449</endChangeId><Timeout>0</Timeout></GetChanges></S:Body></S:Envelope>  bafe1d43-e41c-47e9-bff2-5dc35a15298d
06/20/2011 08:24:03.80  w3wp.exe (0x1C2C)                           0x0CAC  SharePoint Foundation           General                         9ka5    Verbose     GetChanges: objectType=SiteCollection, contentDbId={E5C5E20X-5A9F-406C-B9F6-28923750CECD}, startChange=, endChange=; MaxChanges=0, MaxSPRequests=50 bafe1d43-e41c-47e9-bff2-3dc35a15298d
<代码> 06 / 20/2011 08:24: 3.80 W3WP.EXE(0x1C2C)0x0CAC SharePoint基金会一般FBS6媒体站点收集{E5C5E20X-5A9F 406C-B9F68923 7750CECD};1.69c025ce-96a7-4131-adc0-7da1603e8d24;634439772069030000;474490 bafe1d43-e41c-47e9-bff2-5dc35a15298d 06/20/2011 08:24: 3.80 W3WP.EXE(0x1C2C)0x0CAC SharePoint基金会一般9KE5VBBOSE GETSchange:ObjyType = SITECOLSECT,CordTunBID={E5C5E20X-5A9F-406C-B9F689247750CeCD},StistCree=,Engchange=;MaxChanges=0,MaxSPRequests=50 bafe1d43-e41c-47e9-bff2-3dc35a15298d 请注意,在第二行中,内容数据库Id由“{}”字符括起。另外,请注意从传入的XML正确解析了“contentDbId”,而“endChange”为空。第二个观察结果,可能是导致“对象引用未设置为对象实例”异常的原因。那么,这个changeId有什么问题?不知道,XML编码可能有问题,导致SharePoint无法正确解析changeId

通过进一步查看同一日志,我发现以下几行:

06/20/2011 08:42:54.35  w3wp.exe (0x1C2C)                           0x2BC4  SharePoint Foundation           General                         fbs6    Medium      <?xml version='1.0' encoding='UTF-8'?><soapenv:Envelope xmlns:soapenv="http://www.w3.org/2003/05/soap-envelope"><soapenv:Body><ns1:GetChangesEx xmlns:ns1="http://schemas.microsoft.com/sharepoint/soap/"><ns1:version>1</ns1:version><ns1:xmlInput>&lt;GetChanges>&lt;ObjectType>1&lt;/ObjectType>&lt;ContentDatabaseId>{x4284f47-f050-4fe9-b7e9-caf8f4b882b0}&lt;/ContentDatabaseId>&lt;StartChangeId>1;0;x4284f47-f050-4fe9-b7e9-caf8f4b882b0;634441572386370000;72973&lt;/StartChangeId>&lt;EndChangeId />&lt;RequestLoad>100&lt;/RequestLoad>&lt;GetMetadata>False&lt;/GetMetadata>&lt;IgnoreSecurityIfInherit>True&lt;/IgnoreSecurityIfInherit>&lt;/GetChanges></ns1:xmlInput></ns1:GetChangesEx></soapenv:Body></soapenv:Envelope>   fa5ab5a7-2e27-4e78-aa1f-b027ca3b120f
06/20/2011 08:42:54.35  w3wp.exe (0x1C2C)                           0x2BC4  SharePoint Foundation           General                         9ka5    Verbose     GetChanges: objectType=ContentDatabase, contentDbId={x4284f47-f050-4fe9-b7e9-caf8f4b882b0}, startChange=1;0;x4284f47-f050-4fe9-b7e9-caf8f4b882b0;634441572386370000;72973, endChange=; MaxChanges=500, MaxSPRequests=50 fa5ab5b7-2e27-4e78-aa1f-b027ca3b120f
<代码> 06 / 20/2011 08:42: 54.35 W3WP.EXE(0x1C2C)0x2BC4 SharePoint基金会一般FBS6介质GETMechange > ObjyType > 1 /ObjutType > Cordon DATABASEID > {X4244F450F050-4FE9B7E9CAF8F4B82B0}/ Cordon DATABASEID > STARTEXEXEDID > 1;0;x4284f47-f050-4fe9-b7e9-caf8f4b882b0;634441572386370000;72973/StartChangeId>EndChangeId/>RequestLoad>100/RequestLoad>GetMetadata>False/GetMetadata>IgnoreSecurityIfInherit>True/IgnoreSecurityIfInherit>/GetChanges>fa5ab5a7-2e27-4e78-aa1f-b027ca3b120f 06/20/2011 08:42: 54.35 W3WP.EXE(0x1C2C)0x2BC4 SharePoint基金会一般9KA5 VBBOSE GETREST:ObjtType = Cordon数据库,CordTunBID={X4244F450F050-4FE9B7E9CAF8F4B82B0},StistCreation=1;0;x4284f47-f050-4fe9-b7e9-caf8f4b882b0;634441572386370000;72973,endChange=;MaxChanges=500,MaxSPRequests=50 fa5ab5b7-2e27-4e78-aa1f-b027ca3b120f 这里,从传入的XML正确解析changeId。因此,我将GetChanges()方法更改为GetChangesEx(),传递了与前一次调用完全相同的参数,并且工作正常!!我的猜测是,因为参数是在请求中的SOAP元素中编码的,所以Web服务能够正确地解析它们

下面是最后一条SOAP In消息(格式化):


1.
GetChanges>ObjectType>7/ObjectType>ContentDatabaseId>{X5C5E20A-5A9F-406C-B9F6-28923750CECD}/ContentDatabaseId>StartChangeId>1;1.69f025ce-96a7-4131-adc0-7da1603e8d24;634439727021700000;47404/开始更改ID>结束更改ID>1;1.69d025ce-96a7-4131-adc0-7da1603e8b24;634441802456970000;47472/EndChangeId>RequestLoad>100/RequestLoad>GetMetadata>False/GetMetadata>IgnoreSecurityIfInherit>True/IgnoreSecurityIfInherit>/GetChanges>
06/20/2011 08:24:03.80 w3wp.exe (0x1C2C) 0x0CAC SharePoint Foundation General fbs6 Medium <?xml version="1.0" ?><S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/"><S:Body><GetChanges xmlns="http://schemas.microsoft.com/sharepoint/soap/"><objectType>SiteCollection</objectType><contentDatabaseId>{E5C5E20X-5A9F-406C-B9F6-28923750CECD}</contentDatabaseId><startChangeId></startChangeId><endChangeId>1;1;69c025ce-96a7-4131-adc0-7da1603e8d24;634439772069030000;47449</endChangeId><Timeout>0</Timeout></GetChanges></S:Body></S:Envelope> bafe1d43-e41c-47e9-bff2-5dc35a15298d 06/20/2011 08:24:03.80 w3wp.exe (0x1C2C) 0x0CAC SharePoint Foundation General 9ka5 Verbose GetChanges: objectType=SiteCollection, contentDbId={E5C5E20X-5A9F-406C-B9F6-28923750CECD}, startChange=, endChange=; MaxChanges=0, MaxSPRequests=50 bafe1d43-e41c-47e9-bff2-3dc35a15298d
06/20/2011 08:42:54.35  w3wp.exe (0x1C2C)                           0x2BC4  SharePoint Foundation           General                         fbs6    Medium      <?xml version='1.0' encoding='UTF-8'?><soapenv:Envelope xmlns:soapenv="http://www.w3.org/2003/05/soap-envelope"><soapenv:Body><ns1:GetChangesEx xmlns:ns1="http://schemas.microsoft.com/sharepoint/soap/"><ns1:version>1</ns1:version><ns1:xmlInput>&lt;GetChanges>&lt;ObjectType>1&lt;/ObjectType>&lt;ContentDatabaseId>{x4284f47-f050-4fe9-b7e9-caf8f4b882b0}&lt;/ContentDatabaseId>&lt;StartChangeId>1;0;x4284f47-f050-4fe9-b7e9-caf8f4b882b0;634441572386370000;72973&lt;/StartChangeId>&lt;EndChangeId />&lt;RequestLoad>100&lt;/RequestLoad>&lt;GetMetadata>False&lt;/GetMetadata>&lt;IgnoreSecurityIfInherit>True&lt;/IgnoreSecurityIfInherit>&lt;/GetChanges></ns1:xmlInput></ns1:GetChangesEx></soapenv:Body></soapenv:Envelope>   fa5ab5a7-2e27-4e78-aa1f-b027ca3b120f
06/20/2011 08:42:54.35  w3wp.exe (0x1C2C)                           0x2BC4  SharePoint Foundation           General                         9ka5    Verbose     GetChanges: objectType=ContentDatabase, contentDbId={x4284f47-f050-4fe9-b7e9-caf8f4b882b0}, startChange=1;0;x4284f47-f050-4fe9-b7e9-caf8f4b882b0;634441572386370000;72973, endChange=; MaxChanges=500, MaxSPRequests=50 fa5ab5b7-2e27-4e78-aa1f-b027ca3b120f
<?xml version='1.0' encoding='UTF-8'?>
<soapenv:Envelope xmlns:soapenv="http://www.w3.org/2003/05/soap-envelope">
    <soapenv:Body>
        <ns1:GetChangesEx xmlns:ns1="http://schemas.microsoft.com/sharepoint/soap/">
            <ns1:version>1</ns1:version>
            <ns1:xmlInput>&lt;GetChanges>&lt;ObjectType>7&lt;/ObjectType>&lt;ContentDatabaseId>{X5C5E20A-5A9F-406C-B9F6-28923750CECD}&lt;/ContentDatabaseId>&lt;StartChangeId>1;1;69f025ce-96a7-4131-adc0-7da1603e8d24;634439727021700000;47404&lt;/StartChangeId>&lt;EndChangeId>1;1;69d025ce-96a7-4131-adc0-7da1603e8b24;634441802456970000;47472&lt;/EndChangeId>&lt;RequestLoad>100&lt;/RequestLoad>&lt;GetMetadata>False&lt;/GetMetadata>&lt;IgnoreSecurityIfInherit>True&lt;/IgnoreSecurityIfInherit>&lt;/GetChanges></ns1:xmlInput>
        </ns1:GetChangesEx>
    </soapenv:Body>
</soapenv:Envelope>
SiteData.SiteDataSoapClient siteDataService = new SiteData.SiteDataSoapClient();
siteDataService.Endpoint.Address = new System.ServiceModel.EndpointAddress("URL/_vti_bin/sitedata.asmx");
siteDataService.ClientCredentials.Windows.ClientCredential = new System.Net.NetworkCredential("username", "password", "domain");
siteDataService.ClientCredentials.Windows.AllowedImpersonationLevel = System.Security.Principal.TokenImpersonationLevel.Impersonation;

String xmlInput = "<GetChanges>" + 
                  "<ObjectType>7</ObjectType>" + 
                  "<ContentDatabaseId>{X5C5E20A-5A9F-406C-B9F6-28923750CECD}</ContentDatabaseId>" + 
                  "<StartChangeId>1;1;69b025ce-96a7-4131-adc0-7da1603e8d24;634439727021700000;47404</StartChangeId>" + 
                  "<EndChangeId>1;1;69b025ce-96a7-4131-adc0-7da1603e8d24;634441802456970000;47472</EndChangeId>" + 
                  "<RequestLoad>100</RequestLoad>" + 
                  "<GetMetadata>False</GetMetadata>" + 
                  "<IgnoreSecurityIfInherit>True</IgnoreSecurityIfInherit>" + 
                  "</GetChanges>";
String result = siteDataService.GetChangesEx(1, xmlInput);