RestClient无BaseUrl定义问题求助:C#同步MongoDB到Salesforce报错
解决RestSharp中BaseUrl不存在的报错问题
你的报错是因为RestSharp v107及以上版本已经移除了BaseUrl属性,旧版本的API在新版本中不再兼容,而你使用的代码基于旧版RestSharp,所以会出现该错误。以下是两种可行的解决方案:
方案一:创建新的RestClient实例(推荐)
直接为Salesforce数据请求创建独立的RestClient,传入目标实例URL,无需修改原有认证用的client,逻辑更清晰:
修正后的完整代码
using System; using System.Collections.Generic; using MongoDB.Bson; using MongoDB.Driver; using Newtonsoft.Json.Linq; using RestSharp; namespace SalesforceToMongoDB { class Program { static void Main(string[] args) { // 1. 向Salesforce请求认证令牌 var authClient = new RestClient("https://login.salesforce.com"); var authRequest = new RestRequest("/services/oauth2/token", Method.Post); authRequest.AddParameter("grant_type", "password"); authRequest.AddParameter("client_id", "your_client_id"); authRequest.AddParameter("client_secret", "your_client_secret"); authRequest.AddParameter("username", "your_username"); authRequest.AddParameter("password", "your_password"); RestResponse authResponse = authClient.Execute(authRequest); JObject obj = JObject.Parse(authResponse.Content); string accessToken = (string)obj["access_token"]; // 2. 创建新的RestClient查询Salesforce联系人数据 var dataClient = new RestClient("https://your-instance.lightning.force.com"); var dataRequest = new RestRequest("/services/data/v50.0/query/?q=SELECT+FirstName,LastName,Email+FROM+Contact", Method.Get); dataRequest.AddHeader("Authorization", "Bearer " + accessToken); RestResponse dataResponse = dataClient.Execute(dataRequest); obj = JObject.Parse(dataResponse.Content); var contacts = new List<BsonDocument>(); foreach (var record in obj["records"]) { var contact = new BsonDocument(); // 处理字段为null的情况,避免空引用异常 contact.Add("FirstName", record["FirstName"]?.ToString() ?? string.Empty); contact.Add("LastName", record["LastName"]?.ToString() ?? string.Empty); contact.Add("Email", record["Email"]?.ToString() ?? string.Empty); contacts.Add(contact); } // 3. 将数据写入MongoDB var mongoClient = new MongoClient("mongodb://localhost:27017"); var mongoDatabase = mongoClient.GetDatabase("SFContacts"); var mongoCollection = mongoDatabase.GetCollection<BsonDocument>("Contacts"); mongoCollection.InsertMany(contacts); } } }
方案二:修改现有RestClient的Options(复用实例)
如果需要复用同一个RestClient,可以通过client.Options.BaseUrl替代旧版的BaseUrl属性:
核心修改片段
// 获取access_token后,修改现有client的基础URL client.Options.BaseUrl = new Uri("https://your-instance.lightning.force.com"); request = new RestRequest("/services/data/v50.0/query/?q=SELECT+FirstName,LastName,Email+FROM+Contact", Method.Get); request.AddHeader("Authorization", "Bearer " + accessToken); RestResponse response = client.Execute(request);
额外提示
- 方案一更适合你的场景:认证请求和数据请求的基础URL不同,分开实例能避免配置冲突,代码可读性更高。
- 代码中添加的
?.ToString() ?? string.Empty是为了处理Salesforce返回字段为null的情况,防止新手遇到空引用异常。
内容的提问来源于stack exchange,提问作者iluvcode
相关产品推荐
相关产品推荐

