Как скопировать файл в SharePoint с помощью WebService? - PullRequest
7 голосов
/ 25 апреля 2009

Я пишу приложение 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 out:

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

Из моих поисков я нашел пару возможных подсказок.

  • Microsoft TechNet - «copy.asmx copyintoitems будет работать только в том случае, если исходный и целевой URL-адреса находятся в одном SPWebApplication (семейство сайтов).»

  • Microsoft Social - "Ссылка на объект не установлена ​​для экземпляра объекта ошибка возникает из-за того, что SharePoint не может идентифицировать это конкретное свойство. "

Это заставляет меня поверить, что мой исходный URL должен быть установлен на что-то, но что? Это происходит с клиентской рабочей станции и не имеет исходного URL.

Любая помощь будет оценена.

спасибо,
Кит

Ответы [ 10 ]

6 голосов
/ 22 апреля 2010

Я знаю, что это старая ветка, но она продолжала появляться, когда я искал решение той же проблемы.

Проверьте ответ Стива Керрана в этой теме http://social.msdn.microsoft.com/Forums/en-SG/sharepointdevelopment/thread/833e38a8-f13c-490d-8ba7-b889b6b25e38. Похоже, что в основном запрос не выполняется, поскольку целевой URL не может быть разрешен.

(Ограничения для нового пользователя стека потока - не может опубликовать более одной ссылки. Остальные см. В моем комментарии)

погладить

1 голос
/ 16 февраля 2012

Я получаю то же сообщение, когда использую учетные данные по умолчанию. Попробуйте заменить их на это:

copyWebService.Credentials 
    = new NetworkCredential("Administrator", "pass", "MyDomain");
1 голос
/ 27 апреля 2009

Вот что сейчас работает:

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

Итак ... У кого-нибудь есть мнение относительно того, что этот метод "PUT" лучше в среде SharePoint, чем использование встроенного веб-сервиса?

Прямо сейчас я должен был бы сказать, что метод "PUT" лучше, так как он работает, и я не мог заставить WebService работать.

Keith

1 голос
/ 27 апреля 2009

Ваш код в порядке, просто используйте целевой 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);
}
1 голос
/ 25 апреля 2009
0 голосов
/ 28 мая 2013

если ваш сервер sharepoint построен на ферме, Проверьте свое «Сопоставление альтернативного доступа», посмотрите, есть ли запись: yourwebserverurl интранет yourwebserverurl если нет, добавьте его.

для моего случая, после добавления этого служба копирования начинает работать.

Возможно, это связано с разрешением адреса баланса нагрузки фермы.

0 голосов
/ 05 декабря 2012

У меня была похожая проблема, оказалось, что клиент был настроен на использование безопасности NTLM, но заголовок NTLM не был присоединен.

В моем случае, потому что я использовал этот код на стороне сервера приложения ASP.NET, я должен был включить проверку подлинности Windows и установить

личность безличная = "истина"

в разделе server.web.

0 голосов
/ 24 сентября 2011

Я не уверен, что это решит вашу проблему, но, когда вы ссылаетесь на веб-сервис, не используйте часть [site] URL.

Попробуйте вместо: http://[server]/_vti_bin/[webservice].

Я не эксперт в SP, но я почти уверен, что веб-сервисы принадлежат главному серверу, а не конкретному сайту.

Надеюсь, это поможет.

0 голосов
/ 26 апреля 2009

Я не понимаю, почему вы используете Copy, а не UpdateListItems . Возможно, UpdateListItems будет лучше соответствовать?

0 голосов
/ 25 апреля 2009

Вот некоторый код, который я написал некоторое время (извиняюсь, мне пришлось собрать его вместе, но, надеюсь, вы поняли это)

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