2017-11-15 1 views
1

私はc#クライアントライブラリを使用しています。microsoft-graph経由で共有ポイントにアップロードする前にファイルにフィールド情報を追加します。

ファイルをアップロードするときに、そのファイルのフィールド(SharePoint列)のいずれかを設定できるようにします。 私はこの

var newfile = await gClient 
    .Sites[mySIteId] 
    .Drives[myDriveId] 
    .Items[mySubFolderId] 
    .ItemWithPath("newFile.txt") 
    .Content 
    .Request() 
    .PutAsync<DriveItem>(fs); 

var li = await gClient 
    .Sites[mySIteId] 
    .Drives[myDriveId] 
    .Items[newifle.Id] 
    .ListItem 
    .Request() 
    .GetAsync(); 

li.Fields.AdditionalData.Add("Title", "My New File Title"); 

await gClient 
    .Sites[mySIteId] 
    .Drives[myDriveId] 
    .Items[newifle.Id] 
    .ListItem 
    .Request() 
    .UpdateAsync(li); 

同様PutAsync<DriveItem>(filestream)への呼び出し後に返されDriveItem.ListItemからFieldValueSetを更新しようとしました。しかし、私はこの例外を取得:

はServiceExceptionフィールド「idは」

が認識されません

上記にはAPIを3回呼び出す必要がありますが、1回の呼び出しでファイルがアップロードされたときにフィールドを追加する方法はありません。要求されたよう

更新情報 -

私は唯一の1フィールドを設定しようとする場合は、「ID」はまだJSONに表示されます。ここでは実際のコードと 'きれい' JSONはある

var fs = new FileStream(@"c:\temp\TestImage.jpg", FileMode.Open); 
    var newfile = await gClient.Sites[SPSiteId] 
     .Drives[LibraryId] 
     .Root 
     .ItemWithPath("TestImage.jpg") 
     .Content 
     .Request() 
     .PutAsync<DriveItem>(fs); 
    var li = await gClient.Sites[SPSiteId] 
     .Drives[LibraryId] 
     .Items[newifle.Id] 
     .ListItem 
     .Request() 
     .GetAsync(); 
    var d = new Dictionary<string, object>(); 
    d.Add("Title", "This should be the title"); 
    li.Fields.AdditionalData = d; 

    await gClient.Sites[SPSiteId] 
     .Drives[LibraryId] 
     .Items[newifle.Id] 
     .ListItem.Request() 
     .UpdateAsync(li); 

ファースト・コール:

PUT /v1.0/sites/xxxxxx.sharepoint.com,af844170-6c96-448b-bb75-b1144fa09f3c,d3904f65-6367-4071-9201-e96ea7c3c5d7/drives/b!cEGEr5Zsi0S7dbEUT6CfPGVPkNNnY3FAkgHpbqfDxdeiLjGMWnChSroudPhjGXRg/root:/TestImage.jpg:/content HTTP/1.1

enter image description here

第二コール:

GET /v1.0/sites/xxxxxx.sharepoint.com,af844170-6c96-448b-bb75-b1144fa09f3c,d3904f65-6367-4071-9201-e96ea7c3c5d7/drives/b!cEGEr5Zsi0S7dbEUT6CfPGVPkNNnY3FAkgHpbqfDxdeiLjGMWnChSroudPhjGXRg/items/01QX3GBJL3RSNVFPDYGBG2FKKARXI7TSBV/listItem HTTP/1.1

enter image description here

サードコール(レスポンスHTTP 400 Bad Requestです):

PATCH /v1.0/sites/xxxxx.sharepoint.com,af844170-6c96-448b-bb75-b1144fa09f3c,d3904f65-6367-4071-9201-e96ea7c3c5d7/drives/b!cEGEr5Zsi0S7dbEUT6CfPGVPkNNnY3FAkgHpbqfDxdeiLjGMWnChSroudPhjGXRg/items/01QX3GBJL3RSNVFPDYGBG2FKKARXI7TSBV/listItem HTTP/1.1

enter image description here

答えて

0

レコードを更新している、あなたがオブジェクト全体に渡さないでください。代わりに、変更するフィールドだけを渡します。

var li = new ListItem(); 
li.Fields.AdditionalData.Add("Title", "My New File Title"); 
await gClient 
    .Sites[mySIteId] 
    .Drives[myDriveId] 
    .Items[newifle.Id] 
    .ListItem 
    .Request() 
    .UpdateAsync(li); 

フルオブジェクトを渡すと、いくつかの読み取り専用プロパティが渡されます。 Microsoft Graphは、指定した値が適用され、それらの値のいずれかが読み取り専用プロパティを対象とする場合は失敗するとみなします。

+0

それを試してみてください。新しい辞書を作成して、私の単一のフィールドを追加しました。その後、辞書を 'ListItem.Fields.AdditionalData'に設定しますが、同じエラーで失敗し、Fiddlerで検査すると、JSONに 'id'フィールドが追加されます。 – OrdinaryOrange

+1

Fiddlerを使用してキャプチャされたリクエストとレスポンスを追加できますか?その要求を生成したクライアントライブラリ呼び出しをインクルードします。 –

関連する問題