2009-04-24 36 views
7

私は、SharePoint上のドキュメントライブラリにXMLファイルを配置する必要があるwinforms C#2.0アプリケーションを作成しています。WebServiceを使用してファイルをSharePointにコピーするにはどうすればよいですか?

私は現在、http://webserver/site/_vti_bin/copy.asmx Webサービスを使用していますオブジェクトモデル(ここで参照するために、無sharepoint.dll)

を使用しての代わりに、Webサービスを使用します。ここで

はいくつかのコードです:このコードが実行されると、私はresultsArrayにパラメータ単一の結果を出す

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

:私の検索から

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

を、私は可能性のカップルを発見しました助けてください。

  • Microsoft TechNet - 「送信元と送信先URLは同じSPWebApplication(サイトコレクション)にある場合copy.asmxのcopyintoitemsのみ動作します。」

  • Microsoft Social - "オブジェクト参照がオブジェクトのインスタンスに設定されていません。 SharePointが特定のプロパティを識別できないためにエラーが発生しました。"

これは私のソースURLを何かに設定する必要があると信じていますが、何ですか?これはクライアントワークステーションから発生したもので、ソースURLはありません。

どのようなヘルプも魅力的です。

ハンクあなたを、
キース

+0

http://geek.hubkey.com/2007/10/upload-file-to-sharepoint-document.html –

答えて

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

だから、この「PUT」メソッドが使用するよりも、SharePoint環境で優れている場合...誰でもするよう意見を持っています組み込みWebサービス?

今のところ、「PUT」メソッドがうまく機能し、WebServiceを動作させることができなかったと言わなければなりません。

キース

+0

これは私がこの回答に使用したソースです:http://geek.hubkey.com/2007/10/upload-file-to-sharepoint-document.html –

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

私はそれを得られません、あなたはなぜコピーを使用していますかUpdateListItems。おそらくUpdateListItemsはより良い一致になりますか?

+0

コピーは、ドキュメントライブラリにファイルをアップロードするときに使用され、リストの場合はUpdateListItems(例:タスク)に使用されます。 –

1

コードは問題ありません。空の文字列ではなく宛先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); 
} 
+0

何か不足していますか?私はまだ空の文字列としてSourceURLパラメータを参照してください?私はそのパラメータを "http://webserver/site/Doclib/UploadedDocument.xml"で埋めていますが、実行時にも同じ結果が得られます。 Keith –

+0

申し訳ありませんが、私はばかです。私はパラメータを忘れてしまった。 興味深いことに、あなたのコードが自分のマシン上で甘く実行されているので、まだ問題があります。 – Nat

+0

このコードは、SharePointインスタンスと同じマシンで実行していますか?私の同僚はこのコードも実行していますが、SPインスタンスと同じマシン上にあります。マシン上でコードを実行していますが、実際の状況を再現するためにSPがバーチャルマシンで実行されています。これが根底にある問題であれば興味があります。 –

6

は、私は、これは古いスレッドです知っているが、私は同じ問題への解決策を探していたとして、それが来る続けました。

このスレッドでSteve Curranの答えをチェックしてくださいhttp://social.msdn.microsoft.com/Forums/en-SG/sharepointdevelopment/thread/833e38a8-f13c-490d-8ba7-b889b6b25e38。基本的には、宛先URLを解決できないため、要求は失敗します。

(新しいstackflowユーザーの制限事項 - 。一つのリンクより多くを投稿することはできません残りのための私のコメントを参照してください)

パット

+3

(残りはここにあります) 私は共有ポイントを設定します。代替アクセス彼の記事http://blogs.msdnによるマッピング。admin-need-about-alternate-access-mappings-part-1.aspx(プロキシビットではなくマッピング部分のみ)com/sharepoint/archive/2007/03/06/what-every-sharepoint-そして - 成功。 もう1つのリクエストの詳細、 'SourceUrl'は空白にすることはできませんが、有効なURLである必要はありません。 「フィールド」は空白にすることができます。 その他の詳細 - 私はPython Sudsをクライアントとして使用しています。 pat – pat

+0

+1をダブルURLに近づけるには – xdhmoore

0

私はそれはあなたの問題を解決するのかはわからないけど、 Webサービスを参照するときは、URLの[site]部分を使用しないでください。

代わりにhttp:// [server]/_vti_bin/[webservice]を入力してください。

私はSPのエキスパートではありませんが、Webservicesは主なサーバーに属していると確信しています。

希望します。

+0

Webサービスはサーバー固有のものではなく、サイト固有のものです。 – JimmyBoh

1

デフォルトの資格情報を使用すると、同じメッセージが表示されます。 これでそれらを交換してみてください:

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

私は似問題を抱えていた、それはクライアントがNTLMセキュリティを使用するように設定されましたが、何のNTLMヘッダーを取り付けなかったことが判明しました。

は、私は私の場合は、私はASP.NETのapplicatonのサーバ側でこのコードを使用していたという事実のbecuase、Windows認証を有効にするためだったと

身元偽装=「true」に設定しましたserver.webセクションの

yourwebserverurlイントラネットyourwebserverurl いない場合は、それを追加します。

0

SharePointサーバーがファーム上に構築されている場合、 はあなたの「代替アクセスマッピング」エントリがあるかどうかを確認を確認してください。

私の場合は、これを追加した後、コピーサービスが開始されます。

これはおそらく、ファームの負荷分散アドレスの解決に関連しているためです。

関連する問題