09.08.2010, 00:23 | #1 |
Участник
|
cannot call because it is a web method
Здравствуйте!
Столкнулся со следующей проблемой: Если я в плагине запрашиваю данные и создаю BusinessEntity[] buss = service.RetrieveMultiple(query).BusinessEntities; После делаю update либо Create сущности: service.Update((BusinessEntity)salesOrder); А после делаю опять запрос и апдейт (уже другой сущности, но в том же плагине), то на BusinessEntity[] плагин падает с ошибкой cannot call because it is a web method Если я сначала запрашиваю и создаю 2 BusinessEntity[], а потом делаю апдейт первой, потом второй - то на втором service.Update плагин падает с той же ошибкой. Вопрос в следующем: может быть нужно как-то освобождать сервис грубо говоря "закрывать сессию"? Или ошибка в другом? |
|
09.08.2010, 00:32 | #2 |
Чайный пьяница
|
1. Попытайтесь более структурированно излагать свои мысли. Честно сказать - сумбурный вопрос.
2. Если покажете код - будет проще разобраться.
__________________
Эмо разработчик, сначала пишу код, потом плачу над его несовершенством. Подписывайтесь на мой блог, twitter и YouTube канал. Пользуйтесь моим Ultimate Workflow Toolkit |
|
09.08.2010, 10:18 | #3 |
Участник
|
Согласен думаю по коду будет проще понять в чем проблема:
Код: using System; using System.Collections.Generic; using System.Linq; using System.Text; using Microsoft.Win32; using SDK = Microsoft.Crm.Sdk; using pluginUpdateKursperescheta.CrmSdk; namespace pluginUpdateKursperescheta { public class onUpdateKp : SDK::IPlugin { public void Execute(SDK.IPluginExecutionContext context) { CrmAuthenticationToken token = new CrmAuthenticationToken(); token.AuthenticationType = 0; token.OrganizationName = context.OrganizationName; CrmService service = new CrmService(); RegistryKey regkey = Registry.LocalMachine.OpenSubKey("SOFTWARE\\Microsoft\\MSCRM"); service.Url = String.Concat(regkey.GetValue("ServerUrl").ToString(), "/2007/crmservice.asmx"); service.CrmAuthenticationTokenValue = token; service.UseDefaultCredentials = true; //----------------------------------------------------------------------------------------- SDK::DynamicEntity currentKp = context.PostEntityImages["KpIm"] as SDK::DynamicEntity; try { if (currentKp.Properties.Contains("new_kursperesheta")) { ColumnSet cols = new ColumnSet() { Attributes = new string[] { "new_wholeamount" } }; ConditionExpression cond = new ConditionExpression() { AttributeName = "quoteid", Operator = ConditionOperator.Equal, Values = new object[] { ((SDK::Key)currentKp.Properties["quoteid"]).Value } }; FilterExpression filt = new FilterExpression() { Conditions = new ConditionExpression[] { cond } }; QueryExpression query = new QueryExpression() { ColumnSet = cols, EntityName = EntityName.quotedetail.ToString(), Criteria = filt, }; BusinessEntity[] buss = service.RetrieveMultiple(query).BusinessEntities; decimal wholeamount = 0; foreach (var item in buss) { wholeamount += ((quotedetail)item).new_wholeamount.Value; } ColumnSet colsTemp = new ColumnSet() { Attributes = new string[] { "new_temp_salesorderid" } }; ConditionExpression condTemp = new ConditionExpression() { AttributeName = "new_quoteid", Operator = ConditionOperator.Equal, Values = new object[] {((SDK::Key)currentKp.Properties["quoteid"]).Value } }; FilterExpression filTemp = new FilterExpression() { Conditions = new ConditionExpression[] { condTemp } }; QueryExpression queryTemp = new QueryExpression() { ColumnSet = colsTemp, EntityName = EntityName.new_temp_salesorder.ToString(), Criteria = filTemp }; BusinessEntity[] bussTemp = service.RetrieveMultiple(queryTemp).BusinessEntities; if (bussTemp.Length > 0) { new_temp_salesorder tempSales = new new_temp_salesorder(); tempSales.new_temp_salesorderid = new Key() { Value = ((new_temp_salesorder)bussTemp[0]).new_temp_salesorderid.Value }; tempSales.new_quoteid = ((SDK::Key)currentKp.Properties["quoteid"]).Value.ToString(); tempSales.new_totallineitemamount = new CrmMoney() { Value = wholeamount }; tempSales.new_discountamount = new CrmMoney() { Value = wholeamount - (wholeamount * ((SDK::CrmDecimal)currentKp.Properties["discountpercentage"]).Value / 100) }; tempSales.new_totaltax = new CrmMoney() { Value = tempSales.new_discountamount.Value * Convert.ToDecimal(0.18) }; tempSales.new_totalamount = new CrmMoney() { Value = tempSales.new_totaltax.Value + tempSales.new_discountamount.Value }; service.Update((BusinessEntity)tempSales); } else { new_temp_salesorder tempSales = new new_temp_salesorder(); tempSales.new_temp_salesorderid = new Key(); tempSales.new_name = ((SDK::Key)currentKp.Properties["quoteid"]).Value.ToString(); tempSales.ownerid = new Owner() { Value = ((SDK::Lookup)currentKp.Properties["createdby"]).Value }; tempSales.new_quoteid = ((SDK::Key)currentKp.Properties["quoteid"]).Value.ToString(); tempSales.new_totallineitemamount = new CrmMoney() { Value = wholeamount }; tempSales.new_discountamount = new CrmMoney() { Value = wholeamount - (wholeamount * ((SDK::CrmDecimal)currentKp.Properties["discountpercentage"]).Value / 100) }; tempSales.new_totaltax = new CrmMoney() { Value = tempSales.new_discountamount.Value * Convert.ToDecimal(0.18) }; tempSales.new_totalamount = new CrmMoney() { Value = tempSales.new_totaltax.Value + tempSales.new_discountamount.Value }; // тут падает service.Create((BusinessEntity)tempSales) Cannot call 'pluginUpdateKursperescheta.CrmSdk.CrmService.Create(pluginUpdateKursperescheta.CrmSdk.BusinessEntity)' because it is a web method. service.Create((BusinessEntity)tempSales); } } } catch (System.Web.Services.Protocols.SoapException ex) { throw new SDK::InvalidPluginExecutionException( String.Format("An error occurred in the {0} plug-in.", this.GetType().ToString()), ex); } } } } Последний раз редактировалось Krom; 09.08.2010 в 10:58. |
|
09.08.2010, 14:45 | #4 |
Участник
|
Код: service.Create((BusinessEntity)tempSales);
__________________
Опыт позволяет ошибаться гораздо увереннее. |
|
09.08.2010, 15:19 | #5 |
Участник
|
Проблему, к сожалению, это не решает.
Возможно и лишнее |
|
09.08.2010, 16:55 | #6 |
Участник
|
Не очень понятно, а накой вы в плагине таким вот способом создаете экземпляр сервиса, почему не делаете так:
X++: ICrmService service = context.CreateCrmService(true); И как регистрируете плагин, на какой событие, какой сущности и что в плане синхронности? |
|
09.08.2010, 18:26 | #7 |
Участник
|
Да тут вообще жуткая каша из неймспейсов.
Надо было пользоваться либо только классами веб-сервиса, либо (что правильнее) только Microsoft.Crm.Sdk. А как сейчас это компилится, я даже не представляю.
__________________
Опыт позволяет ошибаться гораздо увереннее. |
|
10.08.2010, 15:19 | #8 |
Участник
|
Ошибка была тут:
tempSales.ownerid = new Owner() { Value = ((SDK::Lookup)currentKp.Properties["createdby"]).Value }; Понял, что если выдает ошибку такого типа, значит какой-то атрибут не нравится. По поводу неймспейсов: их всего 2. Web Service тянет кастомные сущности. Честно говоря по-другому я не умею. Когда-то показали такую схему, так и работаю Если покажите аналогичный функционал, используя только Microsoft.Crm.Sdk буду очень благодарен |
|
10.08.2010, 15:34 | #9 |
Чайный пьяница
|
Цитата:
Сообщение от Krom
Ошибка была тут:
tempSales.ownerid = new Owner() { Value = ((SDK::Lookup)currentKp.Properties["createdby"]).Value }; Понял, что если выдает ошибку такого типа, значит какой-то атрибут не нравится. По поводу неймспейсов: их всего 2. Web Service тянет кастомные сущности. Честно говоря по-другому я не умею. Когда-то показали такую схему, так и работаю Если покажите аналогичный функционал, используя только Microsoft.Crm.Sdk буду очень благодарен
__________________
Эмо разработчик, сначала пишу код, потом плачу над его несовершенством. Подписывайтесь на мой блог, twitter и YouTube канал. Пользуйтесь моим Ultimate Workflow Toolkit |
|
10.08.2010, 16:05 | #10 |
Участник
|
Ясно, буду пробовать, спасибо.
|
|
|
|