Я вызываю пользовательский веб-API из своего приложения Angular, и мне нужно дважды выполнить JSON.parse () свой ответ, чтобы получить доступ к свойствам. Я не уверен, почему это происходит.

    /// <summary>
    /// Gets list of printers
    /// </summary>
    [HttpGet]
    public IHttpActionResult GetPrinterList()
    {
        try
        {
            List<Printer> pl = new List<Printer>();
            // List the print server's queues
            PrintQueueCollection myPrintQueues = new PrintServer(@"\\LPH-Printers").GetPrintQueues();
            foreach (PrintQueue pq in myPrintQueues)
            {
                Printer p = new Printer();
                p.Name = pq.FullName;

                pl.Add(p);
            }

            return Ok(JsonConvert.SerializeObject(pl));
        }
        catch (Exception e)
        {
            return BadRequest(e.ToString());
        }
    }

Это метод в моем API, и ниже я называю его в Angular.

    'use strict';
    app.factory('printerService', ['$http', 'ngAuthSettings', function ($http, ngAuthSettings) {

var serviceBase = ngAuthSettings.apiServiceBaseUri;
var printerServiceFactory = {};

var _DefaultPrinter = function (val) {
    return $http.get(serviceBase + 'api/LibertyMobile/GetUserDefaultPrinter', {
        params: { 'username': val }
    })
};

var _SetDefaultPrinter = function (userName, DefaultPrinter) {
    return $http({
        url: serviceBase + "api/LibertyMobile/SaveUserDefaultPrinter",
        method: "POST",
        params: { 'username': userName, 'printer': DefaultPrinter }
    });
}

var _GetPrinterList = function () {
    return $http.get(serviceBase + 'api/LibertyMobile/GetPrinterList');
}

printerServiceFactory.DefaultPrinter = _DefaultPrinter;
printerServiceFactory.SetDefaultPrinter = _SetDefaultPrinter;
printerServiceFactory.GetPrinterList = _GetPrinterList;

return printerServiceFactory;

} ] ) ;

Любая помощь будет принята с благодарностью.

    public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
        // Web API configuration and services
        // Configure Web API to use only bearer token authentication.
        config.SuppressDefaultHostAuthentication();
        config.Filters.Add(new HostAuthenticationFilter(OAuthDefaults.AuthenticationType));

        // Web API routes
        config.MapHttpAttributeRoutes();

        //config.Routes.MapHttpRoute(
        //    name: "DefaultApi",
        //    routeTemplate: "api/{controller}/{id}",
        //    defaults: new { id = RouteParameter.Optional }
        //);

        //config.Routes.MapHttpRoute(
        //      name: "GetPartNumbers",
        //      routeTemplate: "api/Inventory/GetPartNumbers/{partnum}/{user}",
        //      defaults: new { controller = "Inventory" }
        //);

        config.Routes.MapHttpRoute(
              name: "ApiByAction",
              routeTemplate: "api/{controller}/{action}",
              defaults: new { controller = "Inventory", action = RouteParameter.Optional }
        );
    }
}

Выше мой код WebApiConfig.cs.

1
jhutchings 6 Июн 2018 в 15:33

1 ответ

Лучший ответ

Этот

return Ok(JsonConvert.SerializeObject(pl));

Платформа будет сериализовать переданное значение, но вы также сериализуете его с помощью JsonConvert.SerializeObject перед передачей его результату действия, отсюда и двойная сериализация.

Просто передайте значение обратно

/// <summary>
/// Gets list of printers
/// </summary>
[HttpGet]
public IHttpActionResult GetPrinterList() {
    try {
        List<Printer> pl = new List<Printer>();
        // List the print server's queues
        PrintQueueCollection myPrintQueues = new PrintServer(@"\\LPH-Printers").GetPrintQueues();
        foreach (PrintQueue pq in myPrintQueues) {
            Printer p = new Printer();
            p.Name = pq.FullName;

            pl.Add(p);
        }

        return Ok(pl);
    } catch (Exception e) {
        return BadRequest(e.ToString());
    }
}

И пусть фреймворк сделает свое дело.

0
Nkosi 6 Июн 2018 в 12:39