Вызов CRM 3.0 не работает: событие: postcreate, исключение: System.InvalidCastException: указанное приведение недопустимо

Просто пытаюсь сделать (я думал) простой вызов, чтобы прочитать число из текстового файла, хранящегося на сервере CRM, использовать его в качестве одного из значений в форме CRM, увеличить число и затем переписать его в текстовый файл. Когда я загружаю форму, выноска якобы ничего не делает, и Event Viewer на сервере выдает мне это бесполезное недействительное сообщение об ошибке приведения. Я просмотрел код и изменил разные вещи безрезультатно, но я новичок и в CRM-вызовах, и в C#, так что, возможно, мне не хватает чего-то глупого. Вот код:

using System;
using System.IO;
using Microsoft.Crm.Callout;

namespace IncrementCompetitorNumber
{
    public class Increment
    {
        public string IncrementNumber()
        {
            string ProjectAutoNumber = "D:\\CRM_Misc\\incrementers\\new_competitornumber.txt";
            string AutoNumber = "0"; 
            string ReturnThis = "0";
            int i = 0;

            lock(this)

            {

            TextReader tr = new StreamReader(ProjectAutoNumber);

            AutoNumber = tr.ReadLine();

            tr.Close();

            ReturnThis = AutoNumber;

            i = Convert.ToInt32(AutoNumber);

            i++;

            AutoNumber = i.ToString();

            TextWriter tw = new StreamWriter(ProjectAutoNumber);

            tw.WriteLine(AutoNumber);

            tw.Close();

            }

            return ReturnThis;
        }
    }
}

Так... кто-нибудь знает, что я делаю не так?

1 ответ

Решение

В коде, который вы опубликовали, нет ничего, что могло бы вызвать недопустимое исключение приведения. На какой строке происходит исключение?

Следует упомянуть, что опубликованный вами код не является выноской CRM 3.0.

Класс выноски CRM 3.0 должен наследоваться от CrmCalloutBase и тогда у вас есть Overide один из различных методов событий, таких как PostUpdate, Вы сделали это еще где и вызываете этот класс оттуда?

Хорошо, из вашего второго комментария я знаю, что вы делаете неправильно. Вы не настроили свой класс по своей сути. Я предполагаю, что вы хотите что-то сделать с возвращенной строкой в ​​какой-то момент, но я проигнорировал это на данный момент, и значение будет просто отброшено.

Измените это следующим образом:

using System;
using System.IO;
using Microsoft.Crm.Callout;

namespace IncrementCompetitorNumber 
{
    public class Increment : CrmCalloutBase
    {
        public override void PostCreate(CalloutUserContext userContext, CalloutEntityContext entityContext, string postImageEntityXml)
        {
            IncrementNumber();
        }

        private string IncrementNumber()
        {
            string ProjectAutoNumber = "D:\\CRM_Misc\\incrementers\\new_competitornumber.txt";
            string AutoNumber = "0"; 
            string ReturnThis = "0";
            int i = 0;

            lock(this)

            {

            TextReader tr = new StreamReader(ProjectAutoNumber);

            AutoNumber = tr.ReadLine();

            tr.Close();

            ReturnThis = AutoNumber;

            i = Convert.ToInt32(AutoNumber);

            i++;

            AutoNumber = i.ToString();

            TextWriter tw = new StreamWriter(ProjectAutoNumber);

            tw.WriteLine(AutoNumber);

            tw.Close();

            }

            return ReturnThis;
        }
    }
}
Другие вопросы по тегам