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

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

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

    我正在编写一个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);
    }
    

    运行此代码时,我在resultsraray 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无法识别该特定属性。“

    这让我相信我的源URL应该设置为某个值,但是什么呢?这是从客户端工作站发出的,没有源URL。

    任何帮助都将得到通知。

    汉克,
    基思

    10 回复  |  直到 12 年前
        1
  •  6
  •   pat    15 年前

    我知道这是一条古老的线索,但当我在寻找解决同一个问题的方法时,它不断出现。

    查一下史蒂夫·科伦的答案 http://social.msdn.microsoft.com/Forums/en-SG/sharepointdevelopment/thread/833e38a8-f13c-490d-8ba7-b889b6b25e38 . 看起来请求基本上是失败的,因为目标URL无法解析。

    (新StackFlow用户的限制-不能发布多个链接。其余见我的评论)

    拍打

        3
  •  1
  •   Keith Sirmons    16 年前

    以下是当前正在工作的内容:

    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环境中是否比使用内置的WebService更好有意见吗?

    现在我不得不说“put”方法更好,因为它可以工作,我无法让WebService工作。

    基思

        4
  •  1
  •   Nat    16 年前

    您的代码很好,只需使用目标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    13 年前

    使用默认凭据时,我会收到相同的消息。 尝试将其替换为:

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

    这是我写的一些代码(我很抱歉,我不得不把它拼凑在一起,但希望你明白它的意思)

        // 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    13 年前

    我不确定它是否能解决您的问题,但是,当您引用WebService时,不要使用URL的[站点]部分。

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

    我不是SP方面的专家,但我确信WebServices属于主服务器,而不是特定的站点。

    希望它有帮助。

        8
  •  0
  •   Pawel Gorczynski    12 年前

    我遇到了一个类似的问题,结果发现客户机被配置为使用NTLM安全性,但没有附加任何NTLM头。

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

    identity impersonate=“真”

    在server.web部分。

        9
  •  0
  •   Mark    12 年前

    如果您的SharePoint服务器是在服务器场上构建的, 检查“备用访问映射”,查看是否有条目: 您的Web服务器URL内部网您的Web服务器URL 如果没有,添加它。

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

    这可能是由于服务器场负载平衡地址解析相关。

        10
  •  -1
  •   Kasper    16 年前

    我不明白,那你为什么用复印件呢? UpdateListItems . 也许更新列表项会更好匹配?