我可以使用XML Libname引擎成功从Sharepoint列表中提取数据,但我不能通过PROC SOAP XML数据发回Sharepoint列表Web服务.具体来说,我试图通过http:// [intranet_site] /sites/IT/_vti_bin/Lists.asmx在sharepoint列表中添加和更新项目
SAS LOG输出:
18399 %let RESPONSE=RESPONSE; 18400 proc soap in=REQUEST 18401 out=&RESPONSE 18402 url="http://[intranet_site]/sites/IT/_vti_bin/Lists.asmx" 18403 webusername="[username]" 18404 webpassword="[password]" 18405 webdomain="[domain]" 18406 SOAPACTION="http://schemas.microsoft.com/sharepoint/soap/UpdateListItems" 18407 ; 18408 run; ERROR: org.springframework.ws.client.WebServiceTransportException: Unauthorized [401]
我已经通过SOAPUI确认传入Lists.asmx Web服务的XML是有效的(当通过SOAPUI手动执行时,我实际上可以在Sharepoint中按预期创建和更新列表项.
由于错误明确指出,由于某种原因,被提供给PROC SOAP的用户身份验证不会使其进入Sharepoint(我在Sharepoint中拥有管理权限,因此我应该拥有正确的权限).令人困惑的是,我可以通过XML Libname提供相同的凭据并将数据拉回来……
**问题**
>如果我通过PROC SOAP传递我的凭据,为什么我无法对Sharepoint进行身份验证?
>是否有任何其他解决方法将此XML传递到Sharepoint(IE:是XML LIBNAME还是PROC HTTP能够通过传入XML来支持这一点)?
>问题出在哪里:SAS与PROC SOAP(我调用程序的方式)或Sharepoint?
…只是为了完整性,可以在下面看到传递到PROC SOAP的示例XML(SOAP 1.1 – 应该由PROC SOAP支持):
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> <soap:Body> <UpdateListItems xmlns="http://schemas.microsoft.com/sharepoint/soap/"> <listName>{851DDBB5-1765-444D-9012-0210F006A4AF}</listName> <updates> <Batch OnError="Continue" ListVersion="1"> <Method ID="1" Cmd="New"> <Field Name='ID'>NEW</Field> <Field Name='Title'>DUMMY</Field> [...shortened for space...] </Method> </Batch> </updates> </UpdateListItems> </soap:Body> </soap:Envelope>我放弃了尝试利用SAS PROC SOAP功能与SharePoint进行交互. NTLM身份验证过于难以克服.我正在寻找一个非常暗淡的未来,无限期地每天多次通过SOAPUI手动执行SOAP XML …当谈到NTLM身份验证功能时,SAS目前还缺乏(基于与SAS支持的讨论,有计划构建此功能,但此时仍在测试中).
然后,我找到了一个解决方案:cURL !!!
有关curl的更多信息,请参见:http://curl.haxx.se/
由于我在Linux环境中使用SAS EG并且在服务器上安装了CURL,因此我可以利用SAS X Command将curl命令传递到控制台.将此与睡眠相结合,允许卷曲时间将SOAP XML传递给SharePoint Web服务并捕获响应.在此之后,我然后拉响应文件来解析它的错误.如果发现错误,我会通过电子邮件向一组支持用户发送电子邮件通知他们错误.到目前为止它看起来运作得相当好.
示例代码如下:
DATA _NULL_; x "cd /prg/SOAP_Request"; /*Navigate to where my XML is stored */ x "curl -X POST -k --negotiate -u 'MyUsername':MyPassword --digest --ntlm -H ""SOAPAction: ""http://schemas.microsoft.com/sharepoint/soap/UpdateListItems"" "" -H ""Content-Type: text/xml; charset=UTF-8"" -d @request_&CLIENTID._&Exets..xml http://Shrpnt/sites/IT/_vti_bin/Lists.asmx > /prg/SOAP_Response/response_&CLIENTID._&Exets..xml"; /* issue the CURL command */ x=sleep(20,1); /* Have SAS sleep for 20 seconds to allow CURL to process */ run;
(为了测试CURL命令,我使用Putty来确保我可以成功发出HTTP POST并接收/捕获响应.一旦完成,我转换代码,以便它可以动态地提取已保存的XML使用相同的方法文件并保存响应.
希望这可以帮助遇到这种情况的每个人.我现在可以与SAS交互并驱动SharePoint列表!