#c# #asp.net-web-api #dynamics-crm #dynamics-crm-2011 #crm
#c# #asp.net-web-api #dynamics-crm #динамика-crm-2011 #crm
Вопрос:
Я новичок в CRM. Я реализовал OAuth для приложения. Я использую подход web api для доступа к конкретным пользовательским данным CRM. Я успешно внедрил веб-api для «Получения пользовательских возможностей», «Обновления пользовательских возможностей». Но я не могу сделать то же самое для «закрыть возможность» или «выиграть возможность».
Примечание: я не использую прокси-сервер OrganizationService при доступе к пользовательским данным. Я использую токен OAuth и вызываю определенный URL-адрес запроса API.
Пожалуйста, помогите мне добиться того же. Очень ценно, если кто-нибудь может показать какие-либо примеры кода и / или как протестировать его в postman.
Мои запросы:
1) Возможно ли с помощью токена OAuth подключиться к OrganizationServiceProxy без передачи учетных данных пользователя?
Пример: получить возможности
URL-адрес запроса: https://testdevcrm.crm8.dynamics.com/api/data/v9.1/opportunities
Заголовок:
Авторизация: предъявитель (доступ открыт)
Принять: application / json
OData-максимальная версия: 4.0
OData-Версия: 4.0
Тип метода: ПОЛУЧИТЬ
Код
#region FectchUserOpportunities
public async Task<JToken> FectchUserOpportunities(string systemuserid,string bearerToken)
{
JToken jResu = null;
try
{
var httpClient = new HttpClient();
httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", bearerToken);
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
string filter = "amp;$filter=_createdby_value eq '" systemuserid "' and opportunityid ne null and statuscode eq 1amp;$orderby=createdon ascamp;$top=5";
string opportunitiesURL = string.Concat(GenericMethods.GetAppSetting("FetchCRMOpportunitiesAPI"), filter);
var result = httpClient.GetAsync(opportunitiesURL).Resu<
if (result != null)
{
var opporJSON = await result.Content.ReadAsStringAsync();
JToken jsonResult = JsonConvert.DeserializeObject<JObject>(opporJSON);
jResu = jsonResult["value"];
}
else
{
jResu = null;
}
}
catch (Exception ex)
{
}
return jResu;
}
#endregion
Комментарии:
1. Ваша проблема решена?
2. По какой-либо причине вы не используете MS SDK?
3. @AnkyUser, я опубликовал ответ, который отлично работает для меня.
4. @дэрил, ты имеешь в виду пакет nuget для CRM?
5. ДА. Если вы используете .Net Framework, то почему, черт возьми, вы бы его не использовали?
Ответ №1:
Ну, есть определенное действие, которое можно вызвать из WebAPI, чтобы закрыть возможность как ВЫИГРЫШНУЮ или ПРОИГРЫШНУЮ. Он называется
WinOpportunity
Потеря возможности
Теперь, как вы вызываете это через Webapi. Вот пример кода со стороны интерфейса для его вызова. Вы можете легко повторить это с помощью Postman и посмотреть, как это помогает.
var parameters = {};
var opportunityclose = {};
opportunityclose.activityid = "00000000-0000-0000-0000-000000000000"; //Delete if creating new record
opportunityclose["@odata.type"] = "Microsoft.Dynamics.CRM.opportunityclose";
opportunityclose["opportunityid@odata.bind"] = "/opportunities(8CA20837-715F-E911-A83A-000D3A3852A3)";
parameters.OpportunityClose = opportunityclose;
parameters.Status = 0;
var req = new XMLHttpRequest();
req.open("POST", Xrm.Page.context.getClientUrl() "/api/data/v9.1/WinOpportunity", false);
req.setRequestHeader("OData-MaxVersion", "4.0");
req.setRequestHeader("OData-Version", "4.0");
req.setRequestHeader("Accept", "application/json");
req.setRequestHeader("Content-Type", "application/json; charset=utf-8");
req.onreadystatechange = function() {
if (this.readyState === 4) {
req.onreadystatechange = null;
if (this.status === 204) {
//Success - No Return Data - Do Something
} else {
Xrm.Utility.alertDialog(this.statusText);
}
}
};
req.send(JSON.stringify(parameters));
var parameters = {};
var opportunityclose = {};
opportunityclose.activityid = "00000000-0000-0000-0000-000000000000"; //Delete if creating new record
opportunityclose["@odata.type"] = "Microsoft.Dynamics.CRM.opportunityclose";
opportunityclose["opportunityid@odata.bind"] = "/opportunities(8CA20837-715F-E911-A83A-000D3A3852A3)";
parameters.OpportunityClose = opportunityclose;
parameters.Status = 0;
var req = new XMLHttpRequest();
req.open("POST", Xrm.Page.context.getClientUrl() "/api/data/v9.1/LoseOpportunity", false);
req.setRequestHeader("OData-MaxVersion", "4.0");
req.setRequestHeader("OData-Version", "4.0");
req.setRequestHeader("Accept", "application/json");
req.setRequestHeader("Content-Type", "application/json; charset=utf-8");
req.onreadystatechange = function() {
if (this.readyState === 4) {
req.onreadystatechange = null;
if (this.status === 204) {
//Success - No Return Data - Do Something
} else {
Xrm.Utility.alertDialog(this.statusText);
}
}
};
req.send(JSON.stringify(parameters));
Ответ №2:
Наконец, я реализовал код C # с использованием web api для opportunity как ВЫИГРАННЫЙ.
Код:
#region UpdateUserOpportunityWon
public async Task<string> UpdateUserOpportunityWon(string bearerToken, string opportunityid, string wonsubject, string actualend = "", int actualrevenue = 0, string wondesc = "")
{
string jResu = "";
try
{
string opportunitiesURL = string.Format(GenericMethods.GetAppSetting("UpdateCRMOpportunityAPI"), opportunityid);
var httpClient = new HttpClient();
httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", bearerToken);
httpClient.DefaultRequestHeaders.Add("OData-MaxVersion", "4.0");
httpClient.DefaultRequestHeaders.Add("OData-Version", "4.0");
httpClient.DefaultRequestHeaders.Add("Accept", "application/json");
//httpClient.DefaultRequestHeaders.Add("Content-Type", "application/json; charset=utf-8");
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
string jsonBody = "";
if (String.IsNullOrEmpty(actualend))
{
jsonBody = "{'Status':3,'OpportunityClose':{'subject':'" wonsubject "','actualrevenue':" actualrevenue ",'description':'" wondesc "','opportunityid@odata.bind':'" opportunitiesURL "'}}";
}
else
{
jsonBody = "{'Status':3,'OpportunityClose':{'subject':'" wonsubject "','actualrevenue':" actualrevenue ",'actualend':'" actualend "','description':'" wondesc "','opportunityid@odata.bind':'" opportunitiesURL "'}}";
}
var content = new StringContent(jsonBody, Encoding.UTF8, "application/json");
string opportunitiesWonURL = string.Format(GenericMethods.GetAppSetting("UpdateOpportunityWon"), opportunityid);
var result = httpClient.PostAsync(opportunitiesWonURL, content).Resu<
// TelemetryHelper.Trace("API res", result.ToString());
string statuscode = result.StatusCode.ToString();
if (result != null)
{
var opporJSON = await result.Content.ReadAsStringAsync();
if (statuscode.ToLower() == "nocontent")
{
jResu = statuscode; //success
}
else
{
JToken jsonResult = JsonConvert.DeserializeObject<JObject>(opporJSON);
if (jsonResult["error"] != null)
{
jResu = jsonResult["error"]["message"].ToString();
}
}
}
else
{
jResu = Resources.CommonAPIError statuscode;
}
}
catch (Exception ex)
{
TelemetryHelper.Trace("API Ex", ex.Message.ToString());
}
return jResu;
}
#endregion