如何使用WebService将文件复制到SharePoint?

我正在编写一个winforms c#2.0应用程序,需要将XML文件放入SharePoint上的文档库中。

我想使用WebService而不是使用对象模型(这里没有sharepoint.dll引用)

我目前正在使用http://webserver/site/_vti_bin/copy.asmx webservice。

这是一些代码:

byte[] xmlByteArray; using (MemoryStream memoryStream = new MemoryStream()) { xmlDocument.Save(memoryStream); xmlBytes = memoryStream.ToArray(); } string[] destinationUrlArray = new string[] {"http://webserver/site/Doclib/UploadedDocument.xml"}; FieldInformation fieldInfo = new FieldInformation(); FieldInformation[] fields = { fieldInfo }; CopyResult[] resultsArray; using (Copy copyService = new Copy()) { copyService.Credentials = CredentialCache.DefaultCredentials; copyService.Url = "http://webserver/site/_vti_bin/copy.asmx"; copyService.Timeout = 600000; uint documentId = copyService.CopyIntoItems("", destinationUrlArray, fields, xmlByteArray, out resultsArray); } 

当这段代码运行时,我在resultsArray out参数中得到一个结果:

 DestinationURL: "http://webserver/site/Doclib/UploadedDocument.xml" ErrorCode: UnKnown ErrorMessage: "Object reference not set to an instance of an object." 

从我的搜索中,我发现了一些可能的帮助。

  • Microsoft TechNet – “只有源和目标URL位于同一SPWebApplication(网站集)中时,copy.asmx copyintoitems才有效。”

  • Microsoft Social – “由于SharePoint无法识别该特定属性,因此未将对象引用设置为对象错误的实例。”

这让我相信我的源URL应该设置为某种东西,但是什么? 这源于客户端工作站,并且没有源URL。

任何帮助都会被批评。

谢谢你,
基思

我知道这是一个老线程,但它一直在我寻找解决同样问题的方法。

查看Steve Curran在这个post上的答案http://social.msdn.microsoft.com/Forums/en-SG/sharepointdevelopment/thread/833e38a8-f13c-490d-8ba7-b889b6b25e38 。 看起来基本上请求失败,因为目标url无法解析。

(新的stackflow用户的限制 – 不能发布多个链接。请参阅我的评论)

SharePoint响应普通的旧HTTP PUT

以下是目前正在进行的工作:

 WebRequest request = WebRequest.Create(“http://webserver/site/Doclib/UploadedDocument.xml”); request.Credentials = CredentialCache.DefaultCredentials; request.Method = "PUT"; byte[] buffer = new byte[1024]; using (Stream stream = request.GetRequestStream()) { using (MemoryStream memoryStream = new MemoryStream()) { dataFile.MMRXmlData.Save(memoryStream); memoryStream.Seek(0, SeekOrigin.Begin); for (int i = memoryStream.Read(buffer, 0, buffer.Length); i > 0; i = memoryStream.Read(buffer, 0, buffer.Length)) { stream.Write(buffer, 0, i); } } } WebResponse response = request.GetResponse(); response.Close(); 

那么……是否有人对SharePoint环境中的“PUT”方法是否比使用内置Web服务更好有意见?

现在我不得不说“PUT”方法更好,因为它有效,我无法让WebService工作。

基思

你的代码很好,只需使用目标url而不是空字符串。 见下文:

 byte[] xmlByteArray; using (MemoryStream memoryStream = new MemoryStream()) { xmlDocument.Save(memoryStream); xmlBytes = memoryStream.ToArray(); } string destinationUrl = “http://webserver/site/Doclib/UploadedDocument.xml” string[] destinationUrlArray = new string[] { destinationUrl }; FieldInformation fieldInfo = new FieldInformation(); FieldInformation[] fields = { fieldInfo }; CopyResult[] resultsArray; using (Copy copyService = new Copy()) { copyService.Credentials = CredentialCache.DefaultCredentials; copyService.Url = "http://webserver/site/_vti_bin/copy.asmx"; copyService.Timeout = 600000; uint documentId = copyService.CopyIntoItems(destinationUrl , destinationUrlArray, fields, xmlByteArray, out resultsArray); } 

当我使用默认凭据时,我收到相同的消息。 尝试用这个代替它们:

 copyWebService.Credentials = new NetworkCredential("Administrator", "pass", "MyDomain"); 

这是我写了一段时间的一些代码(我道歉,我不得不把它拼凑在一起,但希望你明白了)

  // Create a request using a URL that can receive a post. WebRequest request = WebRequest.Create("http://sharepointsite/somefile.txt"); // Set the Method property of the request to POST. request.Method = "PUT" Stream dataStream; // Set the ContentType property of the WebRequest. request.ContentType = "multipart/form-data; charset=ISO-8859-1"; byte[] byteArray = File.ReadAllBytes(@"c:\somefile.txt"); // Set the ContentLength property of the WebRequest. request.ContentLength = byteArray.Length; // Get the request stream. dataStream = request.GetRequestStream(); // Write the data to the request stream. dataStream.Write(byteArray, 0, byteArray.Length); // Close the Stream object. dataStream.Close(); // Get the response. HttpWebResponse response = (HttpWebResponse)request.GetResponse(); HttpStatusCode statCode = response.StatusCode; // Get the stream containing content returned by the server. dataStream = response.GetResponseStream(); // Open the stream using a StreamReader for easy access. StreamReader reader = new StreamReader(dataStream); // Read the content. string responseFromServer = reader.ReadToEnd(); // Clean up the streams. reader.Close(); dataStream.Close(); response.Close(); 

我不确定它是否能解决您的问题但是,当您引用Web服务时,请不要使用URL的[site]部分。

请改为:http:// [server] / _vti_bin / [webservice]。

我不是SP的专家,但我很确定web服务属于主服务器,而不是特定的站点。

希望能帮助到你。

我有一个类似的问题,结果是客户端配置为使用NTLM安全性,但没有附加NTLM头。

我的情况,因为我在ASP.NET应用程序的服务器端使用此代码,是为了启用Windows身份validation和设置

identity impersonate =“true”

在server.web部分。

如果您的sharepoint服务器是在服务器场上构建的,请检查您的“备用访问映射”,看看是否有条目:yourwebserverurl intranet yourwebserverurl如果没有,请添加它。

对于我的情况,添加此项后,复制服务开始工作。

它可能是由于农场负载平衡地址解析相关。

我不明白,为什么你使用Copy而不是UpdateListItems 。 也许UpdateListItems会更好匹配?