代码之家  ›  专栏  ›  技术社区  ›  Keith Sirmons

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

  •  7
  • Keith Sirmons  · 技术社区  · 17 年前

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

    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 --“只有源URL和目标URL位于同一SPWebApplication(网站集)中时,copy.asmx copyintoitems才有效。”

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

    谢谢你,
    基思

    10 回复  |  直到 17 年前
        1
  •  6
  •   pat    16 年前

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

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

        3
  •  1
  •   Keith Sirmons    17 年前

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

    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环境中是否比使用内置Web服务更好?

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

    基思

        4
  •  1
  •   Nat    17 年前

    你的代码很好,只需使用目标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);
    }
    
        5
  •  1
  •   Christian Specht    14 年前

    当我使用默认凭据时,我收到了同样的消息。 尝试用以下内容替换它们:

    copyWebService.Credentials 
        = new NetworkCredential("Administrator", "pass", "MyDomain");
    
        6
  •  0
  •   Tony Testa    17 年前

    这是我写了一段时间的代码(很抱歉,我不得不把它拼凑在一起,但希望你能理解它的意思)

        // 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();
    
        7
  •  0
  •   Vitor    14 年前

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

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

    希望它能有所帮助。

        8
  •  0
  •   Pawel Gorczynski    13 年前

    我也遇到了类似的问题,结果发现客户端被配置为使用NTLM安全,但没有附加NTLM标头。

    我之所以这样做,是因为我在ASP的服务器端使用了这段代码。NET应用程序,用于启用Windows身份验证并设置

    身份模拟=“true”

    在server.web部分。

        9
  •  0
  •   Mark    13 年前

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

    就我而言,添加此内容后,复制服务开始工作。

    这可能与服务器场负载平衡地址解析有关。

        10
  •  -1
  •   Kasper    17 年前

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