我使用这个命令(从WinXP)生成Java代码来进行JAX-WS调用:
wsimport -keep -extension -Xnocompile http://hostname/sites/teamname/_vti_bin/Copy.asmx?WSDL
我得到一个我使用以下命名端口的Web服务的句柄:
CopySoap port = null;
if (userName != null && password != null) { Copy service = new Copy(); port = service.getCopySoap(); ((BindingProvider) port).getRequestContext().put(BindingProvider.USERNAME_PROPERTY,userName); ((BindingProvider) port).getRequestContext().put(BindingProvider.PASSWORD_PROPERTY,password); } else { throw new Exception("Holy Frijolé! Null userName and/or password!"); }
我使用以下命令调用Web服务:
port.copyIntoItems(sourceUrl,destUrlCollection,fields,"Contents of the file".getBytes(),copyIntoItemsResult,copyResultCollection)
destUrlCollection中的sourceUrl和唯一的url等于“hostname / sites / teamname / Tech Docs / Sub Folder”.
名为fields的FieldInformationCollection对象只包含一个FieldInformation.
FieldInformation对象的“HelloWorld.txt”作为displayName,internalName和value的值.
type属性设置为FieldType.FILE. id属性设置为(java.util.UUID.randomUUID()).toString().
对copyIntoItems的调用成功返回; copyIntoItemsResult包含一个值0和唯一的CopyResult对象
在copyResultCollection中设置的错误代码为“SUCCESS”,并显示一条空错误消息.
当我在Sharepoint上查看“技术文档”库时,在“子文件夹”中没有文件.
为什么不告诉我我做错了什么?我只想错过一步吗?
更新(2011年2月26日)
我已经将我的FieldInformation对象的displayName和internalName属性更改为“标题”.仍然没有快乐,而是向正确的方向迈出一步.
在玩了一下url后,我得到了这些结果:
同时使用sourceUrl和唯一的目标URL等效,没有协议,我得到SUCCESS响应,但文档库中没有出现实际的文档.
当两个URL等同,但指定了一个“http://”协议时,我得到一个UNKNOWN错误,“对象引用未设置为对象的实例”.作为消息.
源URL是一个空字符串或null,“值不在预期范围内”.作为错误消息.
更新(2011年3月2日)
据Alexei Levenkov的建议,我用Fiddler看看发生了什么,发现这一点:
# Result Protocol Host URL Body Caching Content-Type Process Comments Custom 34 401 HTTP hostname /sites/teamname/_vti_bin/Copy.asmx?WSDL 1,656 text/html javaw:5304 35 401 HTTP hostname /sites/teamname/_vti_bin/Copy.asmx?WSDL 1,539 text/html javaw:5304 36 200 HTTP hostname /sites/teamname/_vti_bin/Copy.asmx?WSDL 10,887 private text/xml; charset=utf-8 javaw:5304 37 401 HTTP hostname /sites/teamname/_vti_bin/Copy.asmx 1,656 text/html javaw:5304 38 401 HTTP hostname /sites/teamname/_vti_bin/Copy.asmx 1,539 text/html javaw:5304 39 200 HTTP hostname /sites/teamname/_vti_bin/Copy.asmx 611 private,max-age=0 text/xml; charset=utf-8 javaw:5304
它看起来像一个简单的握手,直到它获得HTTP 200为WSDL和Web服务调用.
所以我试着没有把我的用户名和密码放在RequestContext中,我得到一个类似的东西,就像上面的WSDL请求(两个HTTP 401和一个HTTP 200)一样,但WebService调用只有一个HTTP 200.如果不再使用我的用户名/密码,那么在理论上应该认证失败.