|
![]() |
#1 |
Участник
|
Для полноценной работы с форматом 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); } .... Код: 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()); } |
|
Теги |
aif, ax2012, json, services, wcf |
|
|