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

时间:2009-04-24 21:16:34

标签: c# web-services sharepoint file-upload

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

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

我目前正在使用http://webserver/site/_vti_bin/copy.asmx网络服务。

以下是一些代码:

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输出参数中得到一个结果:

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

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

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

  • Microsoft Social - “对象引用未设置为对象的实例 由于SharePoint无法识别该特定属性而发生错误。“

这让我相信我的源网址应该设置为什么,但是什么?这源于客户端工作站,没有源URL。

任何帮助都会被批评。

hank你,
基思

10 个答案:

答案 0 :(得分:6)

我知道这是一个旧线程,但在我寻找同一问题的解决方案时,它一直在上升。

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

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

答案 1 :(得分:1)

答案 2 :(得分:1)

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

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);
}

答案 3 :(得分:1)

以下是目前的工作内容:

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工作。

基思

答案 4 :(得分:1)

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

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

答案 5 :(得分:0)

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

    // 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();

答案 6 :(得分:0)

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

请尝试:http:// [server] / _vti_bin / [webservice]。

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

希望它有所帮助。

答案 7 :(得分:0)

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

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

identity impersonate =“true”

在server.web部分。

答案 8 :(得分:0)

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

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

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

答案 9 :(得分:-1)

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