65.9K
CodeProject 正在变化。 阅读更多。
Home

Salesforce API与ASP.Net应用程序集成

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.89/5 (8投票s)

2015年3月16日

CPOL

8分钟阅读

viewsIcon

56448

downloadIcon

9

本文将通过代码示例介绍如何将Salesforce与.NET应用程序集成。

引言

Force.com平台通过Force.com SOAP API与Microsoft .NET技术紧密集成,使您可以访问和操作Force.com云中的数据和功能。这些功能可以在任何Microsoft .NET支持的平台上执行,包括但不限于IIS上运行的Web应用程序、Windows桌面或服务器应用程序、SharePoint服务以及SQL Server可编程性。

本文提供了有关将Force.com平台与Microsoft .NET集成的各种选项的详细信息。阅读本文后,您将对利用Force.com SOAP API在任何Microsoft .NET平台上的方法、最佳实践和代码示例有一个基础了解。

必备条件

为了正确理解本文,假设用户在.NET技术、C#语言、Web服务基础以及Salesforce(对象、选项卡等)方面拥有良好的知识。此外,还假定用于在Salesforce上执行操作的用户帐户拥有执行此类操作所需的所有权限。

背景

要执行任何操作,我们需要获得Salesforce应用程序的有效会话登录。为此,我们需要生成一个Enterprise WSDL,通过它我们将向Salesforce进行身份验证以执行我们的操作。有三种WSDL类型,其中Enterprise WSDL将对我们有用,因为这是在为其组织开发客户端应用程序时主要使用的类型。

集成步骤

第一步(生成WSDL)

WSDL由平台自动生成和维护。我们在Salesforce中创建的任何对象都将自动提供给Partner WSDL。同样,如果我们创建了任何Web服务类,其WSDL也将自动可用。要获取它,我们可以遵循以下步骤:-

进入标准用户界面,登录并导航如下:设置 >> 设置 >> 开发 >> API。

选择适当的WSDL并将文件下载到您的开发环境中可访问的位置。或者,如果预期的WSDL不存在,则执行以下操作:- 登录 >> 设置 >> 开发 >> API >> 点击“生成”。现在我们有了供以后使用的WSDL URL。

第二步(从.Net应用程序添加WSDL引用)

Visual Studio 2008及更高版本现在引用“添加服务引用”到项目,并已弃用“添加Web引用”一词。无论术语或版本如何,在所有Visual Studio版本中,添加WSDL文件引用的步骤基本上是相同的。

  1. 右键单击项目,然后从菜单中选择“添加服务引用”选项。
  2. 将打开“添加服务引用”对话框,单击“高级”。
  3. 在“服务引用设置”对话框中,再次单击“添加Web引用”按钮以继续添加Web引用。
  4. 在“添加Web引用”对话框中,输入我们之前收集的WSDL URL,然后按Enter键。现在它会提示输入Salesforce帐户的用户名和密码。输入用户名和密码,然后单击“登录到Salesforce”按钮。
  5. 在下一步中,为引用指定一个合适的名称,然后单击“添加引用”按钮。
  6. 现在,我们可以在“解决方案资源管理器”中,在项目的“Web引用”文件夹下看到我们添加的Web引用。

第三步(使用Web引用)

要执行任何操作,首先我们需要建立与Salesforce API的有效会话。为此,我们需要以下三项:- 

  1. 用户名:您想通过其执行所有操作的Salesforce帐户的用户名。 
  2. 密码:您想通过其执行所有操作的Salesforce帐户的密码。 
  3. 安全令牌:如果将消费者的IP添加到Salesforce帐户的受信任IP列表中,则不需要安全令牌,否则安全令牌是强制性的。有关更多详细信息,请参阅[此处]

安全令牌是Salesforce自动生成的密钥。例如,如果用户的密码是spassword,安全令牌是XXXXXXXXXX,那么用户必须输入spasswordXXXXXXXXXX才能登录。或者,一些客户端应用程序有单独的安全令牌字段。

注意:对于通过API或客户端的访问,用户必须在其密码末尾添加其安全令牌(如果用户配置文件上设置了API登录的两因素身份验证,并且用户在其帐户中添加了基于时间的令牌,则为基于时间的令牌),以便登录。 
获取安全令牌

我们可以通过Salesforce用户界面更改安全令牌。更改密码会自动将新的安全令牌发送到用户Salesforce记录中的电子邮件地址,或者用户可以使用Salesforce界面重置安全密码来执行相同的操作。
安全令牌的有效性直到用户执行以下操作为止:-

  • 直接重置其安全令牌
  • 更改其密码
  • 或重置其密码。
生成新令牌的步骤

点击页面右上角的用户名 >> 我的设置 >> 个人 >> 重置我的安全令牌。它将重置并为您创建一个新的安全令牌,该令牌可以通过与登录密码连接来用于.Net应用程序中的身份验证。

第四步(在.Net中进行身份验证并创建Salesforce API会话)

声明所需变量
// to store session variable name
private string _username = “salesforce account username”;
// to store session variable name
private string _password = “salesforce account password”; 
// generated tokenid from salesforce
private const string _tokenID = "token id";

// to store session variable name
private string _sessionId;
// next login time
private DateTime _nextLoginTime;
// instance for login result
Private LoginResult _loginResult;
// instance creation for SforceService
Private SforceService _sForceRef;
检查会话是否有效
// this is a method used to check if the session is valid or not by checking with 
// the session variable name
private bool IsValidSession()
            {
            bool blnResult = false;
            if (!string.IsNullOrEmpty(_sessionId) & _sessionId != null)
                {
                if (DateTime.Now > _nextLoginTime)
                    blnResult = false;
                else
                    blnResult = true;
                }
            else
                blnResult = false;

            return blnResult;
            }
        }
如果会话无效,则创建会话

i)    调用login方法,传递用户名和密码,但密码应为Salesforce用户帐户密码与安全令牌的组合。例如:-

         _loginResult = _sForceRef.login(_username, _password + _tokenID);

ii)    从login结果获取会话详细信息并存储到会话变量中。例如:-

              _sessionId = _loginResult.sessionId;
              Session["SessionId"] = _loginResult.sessionId;
              Session["ServerUrl"] = _loginResult.serverUrl;
              Session["NextLoginTime"] = DateTime.Now;

iii)    建立有效的force.com会话以执行任何进一步的操作

_sForceRef.Url = _loginResult.serverUrl;
_sForceRef.SessionHeaderValue = new SessionHeader();
   _sForceRef.SessionHeaderValue.sessionId = _sessionId;
在任何操作之前检查会话有效性

检查当前会话是否有效,如果无效则创建。例如:-

if (!IsValidSession())
                isError = GetSessionDetails();
(注意:这可以在页面加载事件处理程序中检查)

第五步(使用服务执行CRUD操作)

与任何API调用一样,每次调用都会返回一个响应,无论其成功或失败状态如何。因此,Salesforce API调用也会返回一些响应,从中我们可以获得错误或成功的详细信息。API通过三种基于数组的对象发送响应,无论成功还是失败。它们如下:-

1. SaveResult
2. DeleteResult

如果操作成功,则上述两者将包含受操作影响的id数组;否则,它们将包含提供错误详细信息的错误对象数组。

3. QueryResult:成功执行查询字符串后,此对象将包含记录数组作为结果。

获取数据

我已经在Salesforce帐户中创建了一个名为“Candidate”的自定义对象,因此以下示例主要基于对同一对象的各种操作。
i)    实例化QueryResult对象,如下所示:

      QueryResult qr = null;

ii)    准备要执行的查询

string  strQuery = ("SELECT Id, Name, First_Name__c, Last_Name__c from Candidate__c where Name = '" + name + "'");
// here ‘name’ variable contains the name value for which record needs to be fetched

iii)    执行查询并获取结果,例如

qr = _sForceRef.query(strQuery);
            if (qr.size > 0)
                {
                    Candidate__c p = (Candidate__c)qr.records[0];
                }

这里的p是针对所提供姓名的Candidate对象。

创建记录

i)    创建一个新的Candidate对象实例,

       Candidate__c newCand = new Candidate__c();

ii)    为其各种属性分配适当的值,如下所示:

        newCand.First_Name__c = "new first name";
        newCand.Last_Name__c = "new last name";

iii)    通过将前面创建的Candidate对象传递给“SforceService”对象来调用创建方法。

              SaveResult[] saveResults = _sForceRef.create(new sObject[] { newCand });

它将返回一个“SaveResults”数组,其中包含成功或失败状态以及已保存记录的主键id,如下所示:

string result = string.Empty;
          if (saveResults[0].success)
          {
               result = saveResults[0].id; // id of the newly inserted record
          }
          else
          {
               result = saveResults[0].errors[0].message; // failure message
          }

更新记录

i)    通过姓名获取Candidate对象的实例,如下所示:

     Candidate__c c = GetCandidateByName(candidateName);

ii)    如果Candidate在Salesforce帐户中与提供的姓名匹配,则在新Candidate对象中获取Candidate的主键id。同时,将要修改的新值分配给新的Candidate对象。

         Candidate__c existingCand = new Candidate__c();
          existingCand.Id = c.Id;
          existingCand.First_Name__c = "modified first name";
          existingCand.Last_Name__c = "modified last name";

iii)    通过提供此带有新修改值的新Candidate对象来调用update方法。现在它返回“SaveResult”数组,其中包含成功或失败消息以及更新记录的主键id。例如:-

         SaveResult[] saveResults = _sForceRef.update(new SDFR.sObject[] { existingCand });
          string result = string.Empty;
          if (saveResults[0].success)
          {
               result = saveResults[0].id; // id of the newly inserted record
          }
          else
          {
               result = saveResults[0].errors[0].message; // failure message
          }
删除

i)    通过用户提供的Candidate姓名获取Candidate对象。

          Candidate__c c = GetCandidateByName(candidateName);

ii)    获取Candidate对象的唯一主键id,并创建一个包含该id的字符串数组,因为delete方法要求将字符串id数组传递给它以删除通过id数组传递的所有记录。

          String[] ids = new String[] { c.Id };

iii)    在“SforceService”对象上调用delete方法,它返回DeleteResults数组,其中包含删除成功或失败状态以及记录的id(如果成功)。

          DeleteResult[] deleteResults = _sForceRef.delete(ids);

iv)    现在我们需要检查删除操作是成功还是失败。 
如果成功,则获取已删除项目的id;否则,我们可以获取错误消息,如下所示:-

         string result = string.Empty;
          if (deleteResults[0].success)
          {
              result = deleteResults[0].id;
          }  else {
              result = deleteResults[0].errors[0].message;
          }

开发过程中可能遇到的问题及其解决方案

在使用此Web引用时,您可能会遇到如下错误,我也遇到了:-

Unable to generate a temporary class (result=1).
error CS0030: Cannot convert type 'Salesforce.Net.Web.SDF.ListViewRecordColumn[]' to 'Salesforce.Net.Web.SDF.ListViewRecordColumn'

要解决此问题,我们需要在将Web引用添加到Enterprise WSDL时,转到动态生成的“Reference.cs”文件。打开该文件,并将所有“[][]”字符串替换为仅“[]”。有关更详细的信息,您可以参考链接[此处]。

结论

参考本文,您将对如何将Salesforce API集成到.NET应用程序中有一个清晰的认识,以便我们可以通过它访问和操作Salesforce对象。

© . All rights reserved.