使用C#SOAP API将附件上载到Salesforce

问题描述 投票:1回答:1

我需要使用C#SOAP API以编程方式将PDF文件上载到现有的Salesforce记录。

我已经看过this question以及无数其他人,但我发现的一切都没有解决我的问题,或者与另一种语言或REST API有关。我能够找到的所有C#SOAP API信息都使用了Attachment对象,这似乎在API中不存在。我正在使用Partner WSDL并正确地将其添加为我的项目的Web引用。

确实存在EmailFileAttachment对象,但无法将其强制转换为要保存到Salesforce记录的sObject。

这是我目前的代码,我可以很好地更新数据字段。

// Login
var Binding = new SforceService();
var loginResult = Binding.login("Username", "Password");
Binding.Url = loginResult.serverUrl;
Binding.SessionHeaderValue = new SessionHeader();
Binding.SessionHeaderValue.sessionId = loginResult.sessionId;

// Create sObject, update data
var obj = new sObject();
obj.type = "tableName";
obj.Id = "objId";

var document = new XmlDocument();
var nodeList = new List<XmlElement>();

var dataNode = document.CreateElement("fieldName");
dataNode.InnerText = "fieldValue";
nodeList.Add(dataNode);

obj.Any = nodeList.ToArray();

// Save data
sObject[] objArray = { obj };
var saveResults = Binding.update(objArray);

但是我无法使用Attachment或EmailFileAttachment。我知道的Salesforce API命名空间中不存在附件。 EmailFileAttachment具有我需要的所有正确字段,但无法转换为sObject,因此我猜测它不是正确使用的对象,或者我将错误地使用它。

// The type or namespace 'Attachment' could not be found.
//var attachment = new Attachment;

var attachment = new EmailFileAttachment();
attachment.id = "objId";
attachment.fileName = "filename.pdf";
attachment.body = fileData; // fileData is byte[]

// Cannot implicitely convert EmailFileAttachment to sObject.
var objArray = new sObject[] { attachment };

我错过了能够使用附件的东西,还是有其他方法可以做到这一点?

编辑:我正在使用Salesforce C#SOAP API v45.0


编辑:根据superfell的回答,我将文件作为一个完美的sObject上传。唯一的规定是必须将Attachment创建为新的Salesforce对象,并通过ParentId字段链接到原始对象。这是下面的工作代码

var atObj = new sObject();

// Set type as "Attachment"
atObj.type = "Attachment";

var document = new XmlDocument();
var nodeList = new List<XmlElement>();

// Set Filename
var nameNode = document.CreateElement("Name");
nameNode.InnerText = "testfile.pdf";
nodeList.Add(nameNode);

// Set ParentId - this is the object id you want to link the attachment to
var idNode = document.CreateElement("ParentId");
idNode.InnerText = "objId";
nodeList.Add(idNode);

// Set File Data - use Base64 string conversion
string encoded = Convert.ToBase64String(fileData); // fileData is byte[]
var dataNode = document.CreateElement("Body");
dataNode.InnerText = encoded;
nodeList.Add(dataNode);

atObj.Any = nodeList.ToArray();
sObject[] objArray = { atObj };

// Use create(), not update()
var saveResults = Binding.create(objArray);
c# api soap salesforce
1个回答
1
投票

合作伙伴API仅包含通用SObject定义,不包含具体的SObject类型。 (因为它期望合作伙伴想要编写一次代码并让它动态地适应用户架构)。您需要为附件构建合作伙伴SObject实例,或者切换到企业WSDL,它将具有您正在寻找的具体附件类。有关SObject在合作伙伴API中的外观的详细信息,请参见[1]。在C#中有一个示例,用于在[2]处创建SObject实例的合作伙伴API。您应该能够更改它以创建附件而不是联系人。

[1] https://developer.salesforce.com/docs/atlas.en-us.api.meta/api/sforce_api_partner_objects.htm

[2] https://developer.salesforce.com/docs/atlas.en-us.api.meta/api/sample_create_call.htm#topic-title

© www.soinside.com 2019 - 2024. All rights reserved.