Показать сообщение отдельно
Старый 06.08.2020, 13:05   #4  
Brave is offline
Brave
Участник
 
26 / 14 (1) ++
Регистрация: 13.09.2010
Адрес: Санкт-Петербург
Для полноценной работы с форматом JSON, используйте прослойку в виде ASP.NET WEB API прилложения, развёрнутого на IIS, которое занимается перегонкой JSON <-> WCF и объединением различных сервисов DAX, так же оно является промежуточным секюрным слоем, можно добавить кастомную систему авторизации, отфильтровать спам и кривые запросы, сообщить о недоступности сервисов DAX, обработать всякие ситуации, с которыми в DAX порой разобраться будет невозможно. Хорошим плюсом так же является возможность автоматического документирования web API сервиса (используем Swagger).
Стоит не забывать о том, что для работы с WCF DAX необходима авторизация. Для некоторых методов API используется стандартный QueryService, с возможностью постраничного запроса данных. Для некоторых моментов можно использовать метаданные AX так же через стандартный сервис MetadataService. В общем одни плюсы.
В целом всё получается достаточно красиво при правильной организации проекта, примеры вызова:
Код:
 /// <summary>
    /// Методы клиента (покупателя)
    /// </summary>
    [RoutePrefix("api/Sales/v1")]
    [ShowInSwagger]
    public class CustomersController : ApiController
    {
        private CallContext context = ClientFactory.CreateContext<CallContext>();

        /// <summary>
        /// Список клиентов
        /// </summary>
        /// <param name="page">Страница</param>
        /// <param name="pageSize">Количество записей на странице</param>
        [HttpGet]
        [Route("Customers")]
        [SwaggerResponse(HttpStatusCode.OK, Description = "Список клиентов", Type = typeof(IEnumerable<Models.Sales.Customer.CustAccount>))]
        [SwaggerResponse(HttpStatusCode.NotFound, Description = "По запросу ничего не найдено")]
        [SwaggerResponse(HttpStatusCode.BadRequest, Description = "Ошибка AIF/WCF", Type = typeof(AifFaultError))]
        [ResponseType(typeof(QueryResult))]
        [CommonExceptionFilters]
        public IHttpActionResult GetCustomers([FromUri] long page = 1, int pageSize = 50)
        {
            if (page <= 0 || pageSize <= 0)
                return BadRequest();

            return new Queries.Customer.CustomerListQuery(Request, new Models.Common.PaginationMetadata(page, pageSize));
        }
        /// <summary>
        /// Информация о клиенте
        /// </summary>
        /// <param name="CustAccount">Счёт (код клиента)</param>
        [HttpGet]
        [Route("Customers/{CustAccount}")]
        [SwaggerResponse(HttpStatusCode.OK, Description = "Информация о клиенте", Type = typeof(Models.Sales.Customer.CustomerInfo))]
        [SwaggerResponse(HttpStatusCode.NotFound, Description = "По запросу ничего не найдено")]
        [SwaggerResponse(HttpStatusCode.BadRequest, Description = "Ошибка AIF/WCF", Type = typeof(AifFaultError))]
        [CommonExceptionFilters]
        public async Task<IHttpActionResult> GetCustomerInfo([FromUri] string CustAccount)
        {
            Models.Sales.Customer.CustomerInfo result;

            using (var client = ClientFactory.CreateClient<WebCustServicesClient>())
            {
                var request = await client.GetCustomerAsync(context, CustAccount);

                if (request.response == null)
                    return NotFound();

                result = new Models.Sales.Customer.CustomerInfo
                {
                    CustAccount = request.response.CustAccount,
                    CustName = request.response.CustName,
                    WebEmail = request.response.WebEmail,
                    InventLocation = request.response.InventLocation,
                    PersonnelNumber = request.response.PersonnelNumber,
                    RouteId = request.response.RouteId,
                    SegmentId = request.response.SegmentId,
                    Settings = new Models.Sales.Customer.CustSettings() 
                    { 
                        AccountStatement            = request.response.CustSettings.AccountStatement.ToCustAccountStatement(),
                        SalesLineRejectionSendEmail = request.response.CustSettings.SalesLineRejectionSendEmail.ToNoYes()
                    }
                };
            }
            return Ok(result);
        }
        /// <summary>
        /// Баланс клиента
        /// </summary>
        /// <param name="CustAccount">Счёт (код клиента)</param>
        /// <param name="cur">Валюта</param>
        [HttpGet]
        [Route("Customers/{CustAccount}/Balance")]
        [SwaggerResponse(HttpStatusCode.OK, Description = "Баланс клиента", Type = typeof(Models.Sales.Customer.CustBalance))]
        [SwaggerResponse(HttpStatusCode.NotFound, Description = "По запросу ничего не найдено")]
        [SwaggerResponse(HttpStatusCode.BadRequest, Description = "Ошибка AIF/WCF", Type = typeof(AifFaultError))]
        [CommonExceptionFilters]
        public async Task<IHttpActionResult> GetCustBalance([FromUri] string CustAccount,string cur = "")
        {
            Models.Sales.Customer.CustBalance result;
 
            using (var client = ClientFactory.CreateClient<WebCustServicesClient>())
            {
                var request = await client.GetCustBalanceAsync(context, CustAccount,cur);

                result = new Models.Sales.Customer.CustBalance()
                {
                    CustAccount = request.response.CustAccount,
                    Currency = request.response.CustCurrencyCode,
                    Balance = request.response.Balance,
                    ReservAmount = request.response.ReservAmount,
                    SalesOpenAmount = request.response.SalesOpenAmount
                };
            }
            return Ok(result);
        }
....
Пример обработки ошибок WCF AIF:
Код:
 else if (exceptionType == typeof(ActionNotSupportedException))
            {
                AifFaultError error = new AifFaultError();
                error.Infolog.Add(new InfoMsg()
                {
                    Type = Enum.GetName(typeof(InfologMessageType), InfologMessageType.Error),
                    Message = "Метод WCF сервиса не поддерживается. Возможно он был изменён или переименован в AX."

                });
                status = HttpStatusCode.BadRequest;
                message = new ObjectContent<AifFaultError>(error, new JsonMediaTypeFormatter());
            }
            else
            {
                AifFaultError error = new AifFaultError();
                error.Infolog.Add(new InfoMsg()
                {
                    Type = Enum.GetName(typeof(InfologMessageType), InfologMessageType.Error),
                    Message = actionExecutedContext.Exception.Message
                });

                message = new ObjectContent<AifFaultError>(error, new JsonMediaTypeFormatter());
            }