Epicor 10.1.5 SessionModSvcContractClient выход из системы

Кто-нибудь когда-либо имел проблему, когда функция выхода из сеанса SessionModSvcContractClient выдает исключение: Дополнительная информация:

Object reference not set to an instance of an object.

Когда я пробовал методы LogoutAsync и Close, они работали нормально. Может кто-нибудь помочь мне понять, почему это происходит или разница между 3.

Я в основном пытаюсь использовать создать тест из руководства WCF

    static void Main(string[] args)
    {

        //use a self-signed certificate in IIS, be sure to include the following code. This code speeds up calls to the services and prevents the method from trying to validate the certificate with the known authorities.
        ServicePointManager.ServerCertificateValidationCallback += (sender, certificate, chain, errors) => { return true; };

        //You can toggle the value assigned to this variable to test the two bindings: SOAPHttp or BasicHttp
        EndpointBindingType bindingType = EndpointBindingType.SOAPHttp;

        //Epicor credentials:
        string epicorUserID = "XXX";
        string epiorUserPassword = "XXX";


        string scheme = "http";
        if (bindingType == EndpointBindingType.BasicHttp)
        {
            scheme = "https";
        }

        UriBuilder builder = new UriBuilder(scheme, "localhost");

        string webServicesLink = "XXX/";

        builder.Path = webServicesLink + "Ice/Lib/SessionMod.svc";
        SessionModSvcContractClient sessionModClient = GetClient < SessionModSvcContractClient, SessionModSvcContract > (builder.Uri.ToString(), epicorUserID, epiorUserPassword, bindingType);

        builder.Path = webServicesLink + "Erp/BO/AbcCode.svc";
        ABCCodeSvcContractClient abcCodeClient = GetClient<ABCCodeSvcContractClient, ABCCodeSvcContract>(builder.Uri.ToString(), epicorUserID, epiorUserPassword, bindingType);

        Guid sessionId = Guid.Empty;
        sessionId = sessionModClient.Login();

        //Create a new instance of the SessionModSvc. Do this because when you call any method on the service
        //client class, you cannot modify its Endpointbehaviors.
        builder.Path = webServicesLink + "Ice/Lib/SessionMod.svc";
        sessionModClient = GetClient < SessionModSvcContractClient, SessionModSvcContract > (builder.Uri.ToString(),epicorUserID,epiorUserPassword,bindingType);

        sessionModClient.Endpoint.EndpointBehaviors.Add(new HookServiceBehavior(sessionId, epicorUserID));
        abcCodeClient.Endpoint.EndpointBehaviors.Add(new HookServiceBehavior(sessionId, epicorUserID));

        var ts = new ABCCodeTableset();
        abcCodeClient.GetNewABCCode(ref ts);
        var newRow = ts.ABCCode.Where(n => n.RowMod.Equals("A", StringComparison.InvariantCultureIgnoreCase)).FirstOrDefault();
        if (newRow != null)
        {
            newRow.ABCCode = "G";
            newRow.CountFreq = 30;
            newRow.StockValPcnt = 100;
            abcCodeClient.Update(ref ts);
            ts = null;
            ts = abcCodeClient.GetByID("G");
            if (ts != null && ts.ABCCode.Any())
            {
                ABCCodeRow backupRow = new ABCCodeRow();
                var fields = backupRow.GetType().GetProperties(BindingFlags.Instance | BindingFlags.Public);
                foreach (var field in fields)
                {
                    if (field.PropertyType == typeof(System.Runtime.Serialization.ExtensionDataObject))
                    { 
                        continue;
                    }
                    var fieldValue = field.GetValue(ts.ABCCode[0]);
                    field.SetValue(backupRow, fieldValue);
                }
                ts.ABCCode.Add(backupRow);
                ts.ABCCode[0].CountFreq = 45;
                ts.ABCCode[0].RowMod = "U";
                abcCodeClient.Update(ref ts);
                ts = null;
                ts = abcCodeClient.GetByID("G");
                if (ts != null && ts.ABCCode.Any())
                {
                    Console.WriteLine("CountFreq = {0}", ts.ABCCode[0].CountFreq);
                    ts.ABCCode[0].RowMod = "D";
                    abcCodeClient.Update(ref ts);
                    try
                    {
                        ts = abcCodeClient.GetByID("G");
                    }
                    catch (FaultException<Epicor.AbcCodeSvc.EpicorFaultDetail> ex)
                    {
                        if (ex.Detail.ExceptionKindValue.Equals("RecordNotFound", StringComparison.InvariantCultureIgnoreCase))
                        {
                            Console.WriteLine("Record deleted.");
                        }
                        else
                        {
                            Console.WriteLine(ex.Message);
                        }
                    }
                }
            }
        }
        if (sessionId != Guid.Empty)
        {

                sessionModClient.Logout();


        }
        Console.ReadLine();
    }

2 ответа

Ваш код работал нормально для меня после того, как я изменил конфигурацию в соответствии со своей средой.

Похоже, что вы выполнили шаг 7 на странице 15 руководства Epicor10_techrefWCFServices_101400.pdf и правильно создали новый экземпляр SessionModSvc после входа в систему (). Однако, если вы скопировали полный код метода Main со страницы 18, этого не будет, и я смогу повторить вашу проблему.

Убедитесь, что код, который вы компилируете, создал новый экземпляр SessionModSvc после вызова .Login(),

Смотрите мой другой ответ, но в качестве альтернативы вы можете рассмотреть этот метод доступа к услугам.

Если у вас есть доступ к клиентским DLL, тогда этот код может быть проще:

    static void Main(string[] args)
    {
        // Hard-coded LogOn method 
        // Reference: Ice.Core.Session.dll
        Ice.Core.Session session = new Ice.Core.Session("manager", "manager", "net.tcp://AppServer/MyCustomerAppserver-99999-10.0.700.2");

        // References: Epicor.ServiceModel.dll, Erp.Contracts.BO.ABCCode.dll
        var abcCodeBO = Ice.Lib.Framework.WCFServiceSupport.CreateImpl<Erp.Proxy.BO.ABCCodeImpl>(session, Erp.Proxy.BO.ABCCodeImpl.UriPath);

        // Call the BO methods
        var ds = abcCodeBO.GetByID("A");
        var row = ds.ABCCode[0];

        System.Console.WriteLine("CountFreq is {0}", row.CountFreq);
        System.Console.ReadKey();
    }

Просто добавьте ссылки на:

  • Ice.Core.Session.dll
  • Epicor.ServiceModel.dll
  • Erp.Contracts.BO.ABCCode.dll
Другие вопросы по тегам