CAML を使用して SharePoint サーバー上に作成したばかりのリスト アイテムに添付ファイルを追加しようとしています。以下のコードは簡略化されています (たとえば、パスは通常変数で、2 番目のフィールド (アイテム ID、ここでは 16847) は通常、CAML の挿入ステートメントから取得した ID です)。
これは私のコードです:
String desktopPath = Environment.GetFolderPath(Environment.SpecialFolder.Desktop);
String savePath = desktopPath + @"\" + "tutorials.txt";
byte[] data = GetData(savePath);
lists.AddAttachment("Tasks", "16847", "tutorials.txt", data);
次のエラーが表示されます。
変更に従ってセキュリティを更新できません。ItemUpdating 中に次の例外が発生しました: オブジェクト参照がオブジェクトのインスタンスに設定されていません。詳細については、イベント ビューアを参照してください。0x81020089
getdata は、デスクトップ上のファイルを byte[] に変換するメソッドです。データは空ではなく、問題ないようです。
それ以外の Tasks は必要なリストであり、16847 は添付ファイルを追加するタスク ID です。
私が見つけることができる情報のほとんどは、別のエラーに関するものです: 範囲外のインデックス例外 (msdn ページのように: http://msdn.microsoft.com/en-us/library/lists.lists.addattachment(v= office.12).aspx )。
また、http put (明らかに不正アクセス) とコピー サービス (上記の簡単な方法で解決策が見つからない場合は、このコードを投稿できます) も試しました。
誰が何が悪いのか教えてもらえますか?
編集1:
private dcp.Lists lists = new dcp.Lists();
lists.Credentials = System.Net.CredentialCache.DefaultCredentials;
lists.Url = Values.SERVERADDRESS + "/_vti_bin/lists.asmx";
これにより、Web サービスへの接続が初期化されます。更新、挿入では問題なく動作します...
GetData コード:
private byte[] GetData(String savePath)
{
byte[] contents;
using (FileStream fStream = File.OpenRead(savePath))
{
contents = new byte[fStream.Length];
sFileName = fStream.Name;
fStream.Read(contents, 0, Convert.ToInt32(fStream.Length));
}
return contents;
}
編集2:
以下が機能することに注意してください(タスクから既存の添付ファイルの正しいリストを取得します):
XmlNode ndAttach = lists.GetAttachmentCollection("Tasks", "16847");
MessageBox.Show(ndAttach.OuterXml);
そして、以下はそうではありません (AddAttachment メソッドと同じエラー):
lists.DeleteAttachment("Tasks", "16847", ndAttach.ChildNodes[0].InnerText);
msdnのサンプルコードとまったく同じように動作するため、これが機能するはずだと確信しています。 .aspx