Для полноценной работы с форматом 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());
}