我正在编写一个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你,
基思
答案 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会更好匹配吗?