ReadAsStringAsync возвращает только часть JSON / BODY

Я пытаюсь настроить точку интеграции с системой автоматического распознавания номерных знаков (ALPR). Я использую OpenALPR.

На локальном ПК установлен агент с установленной IP-камерой, который будет считывать номерной знак и отправлять информацию в облако. В облаке есть точка интеграции WebHook, которая будет срабатывать каждый раз при регистрации номерного знака.

На веб-странице OpenALPR документация WebHook гласит:

WebHooks send an HTTP POST to your URL every time a plate is received or an alert is triggered. The POST body contains the license plate data.

Я проверил интеграцию, отправив вывод на тестовую страницу WebHook, которая находится по этому адресу: https://webhook.site/

Результат показан в конце этого поста. Как видно, на выходе получается формат JSON.

Я сделал службу RESTful и развернул ее в Azure. Моя проблема в том, что когда я читаю результат, я не получаю полный результат JSON. Основываясь на тесте на сайте http://webhook.site/, я знаю, что поставщик WebHook (отправитель) отправляет все данные JSON, поэтому я не могу понять, почему они не получены полностью.

Если есть лучший способ получить результат JSON в моем веб-приложении, я буду рад услышать об этом. Ниже мое мнение о том, как выполнить работу. За исключением того, что это не работает!:-D

Может кто-нибудь сказать мне, что я делаю неправильно, и почему только часть результата читается?

Это часть кода, которая вызывается по HTTP POST для моей службы.

// POST: api/OpenALP
public HttpResponseMessage Post([FromBody]string value)
{

    var content = Request.Content;

    Request.Content.LoadIntoBufferAsync().Wait();
    string jsonContent = content.ReadAsStringAsync().Result;

    HttpResponseMessage response = Request.CreateResponse(HttpStatusCode.OK);
    return response;
}

РЕДАКТИРОВАТЬ: Не знаю, если это важно, но отладка была сделана путем публикации службы как "Отладка" и присоединение отладчика. Содержание, показанное ниже, было скопировано с точки останова.

Это то, что я получаю в string jsonContent

" \"color\": [{\"confidence\": 92.68022918701172, \"name\": \"white\"}, {\"confidence\": 2.699702501296997, \"name\": \"silver-gray\"}, {\"confidence\": 1.8385039567947388, \"name\": \"yellow\"}, {\"confidence\": 1.024902582168579, \"name\": \"gold-beige\"}, {\"confidence\": 0.5838126540184021, \"name\": \"green\"}], \"make\": [{\"confidence\": 16.192890167236328, \"name\": \"renault\"}, {\"confidence\": 12.871005058288574, \"name\": \"mercedes-benz\"}, {\"confidence\": 7.908616065979004, \"name\": \"volkswagen\"}, {\"confidence\": 4.901283264160156, \"name\": \"opel\"}, {\"confidence\": 4.583385467529297, \"name\": \"bmw\"}], \"body_type\": [{\"confidence\": 20.72427749633789, \"name\": \"sedan-standard\"}, {\"confidence\": 18.412166595458984, \"name\": \"van-mini\"}, {\"confidence\": 17.614177703857422, \"name\": \"sedan-compact\"}, {\"confidence\": 12.435933113098145, \"name\": \"sedan-wagon\"}, {\"confidence\": 6.872223377227783, \"name\": \"suv-crossover\"}], \"year\": [{\"confidence\": 23.91012191772461, \"name\": \"2005-2009\"}, {\"confidence\": 19.78921890258789, \"name\": \"2000-2004\"}, {\"confidence\": 16.811452865600586, \"name\": \"1995-1999\"}, {\"confidence\": 11.53968620300293, \"name\": \"2010-2014\"}, {\"confidence\": 8.91786003112793, \"name\": \"1985-1989\"}], \"make_model\": [{\"confidence\": 2.5598113536834717, \"name\": \"renault_kangoo\"}, {\"confidence\": 1.564223289489746, \"name\": \"fiat_doblo\"}, {\"confidence\": 1.5174164772033691, \"name\": \"alfa-romeo_147\"}, {\"confidence\": 1.0350353717803955, \"name\": \"citroen_2cv\"}, {\"confidence\": 0.986167311668396, \"name\": \"volkswagen_caddy\"}]}, \"best_uuid\": \"WBFOY6ZDPZR03FGCE5C1S9J5GIH2TFH1H6QPMX7X-645063384-1521329355349\", \"epoch_end\": 1521329358227, \"best_image_width\": 640, \"data_type\": \"alpr_group\", \"best_image_height\": 480, \"frame_end\": 865634, \"is_parked\": false, \"web_server_config\": {\"agent_label\": \"DESKTOP-B3PMA1C\", \"camera_label\": \"WebCamHKA\"}, \"best_region\": \"eu-dk\", \"uuids\": [\"WBFOY6ZDPZR03FGCE5C1S9J5GIH2TFH1H6QPMX7X-645063384-1521329355147\", \"WBFOY6ZDPZR03FGCE5C1S9J5GIH2TFH1H6QPMX7X-645063384-1521329355183\", \"WBFOY6ZDPZR03FGCE5C1S9J5GIH2TFH1H6QPMX7X-645063384-1521329355248\", \"WBFOY6ZDPZR03FGCE5C1S9J5GIH2TFH1H6QPMX7X-645063384-1521329355284\", \"WBFOY6ZDPZR03FGCE5C1S9J5GIH2TFH1H6QPMX7X-645063384-1521329355349\", \"WBFOY6ZDPZR03FGCE5C1S9J5GIH2TFH1H6QPMX7X-645063384-1521329355386\", \"WBFOY6ZDPZR03FGCE5C1S9J5GIH2TFH1H6QPMX7X-645063384-1521329355451\", \"WBFOY6ZDPZR03FGCE5C1S9J5GIH2TFH1H6QPMX7X-645063384-1521329355523\", \"WBFOY6ZDPZR03FGCE5C1S9J5GIH2TFH1H6QPMX7X-645063384-1521329355558\", \"WBFOY6ZDPZR03FGCE5C1S9J5GIH2TFH1H6QPMX7X-645063384-1521329355700\", \"WBFOY6ZDPZR03FGCE5C1S9J5GIH2TFH1H6QPMX7X-645063384-1521329355777\", \"WBFOY6ZDPZR03FGCE5C1S9J5GIH2TFH1H6QPMX7X-645063384-1521329355815\", \"WBFOY6ZDPZR03FGCE5C1S9J5GIH2TFH1H6QPMX7X-645063384-1521329355889\", \"WBFOY6ZDPZR03FGCE5C1S9J5GIH2TFH1H6QPMX7X-645063384-1521329356029\", \"WBFOY6ZDPZR03FGCE5C1S9J5GIH2TFH1H6QPMX7X-645063384-1521329356274\", \"WBFOY6ZDPZR03FGCE5C1S9J5GIH2TFH1H6QPMX7X-645063384-1521329356421\", \"WBFOY6ZDPZR03FGCE5C1S9J5GIH2TFH1H6QPMX7X-645063384-1521329356598\", \"WBFOY6ZDPZR03FGCE5C1S9J5GIH2TFH1H6QPMX7X-645063384-1521329356738\", \"WBFOY6ZDPZR03FGCE5C1S9J5GIH2TFH1H6QPMX7X-645063384-1521329356773\", \"WBFOY6ZDPZR03FGCE5C1S9J5GIH2TFH1H6QPMX7X-645063384-1521329356874\", \"WBFOY6ZDPZR03FGCE5C1S9J5GIH2TFH1H6QPMX7X-645063384-1521329356909\", \"WBFOY6ZDPZR03FGCE5C1S9J5GIH2TFH1H6QPMX7X-645063384-1521329357014\", \"WBFOY6ZDPZR03FGCE5C1S9J5GIH2TFH1H6QPMX7X-645063384-1521329357049\", \"WBFOY6ZDPZR03FGCE5C1S9J5GIH2TFH1H6QPMX7X-645063384-1521329357148\", \"WBFOY6ZDPZR03FGCE5C1S9J5GIH2TFH1H6QPMX7X-645063384-1521329357387\", \"WBFOY6ZDPZR03FGCE5C1S9J5GIH2TFH1H6QPMX7X-645063384-1521329357422\", \"WBFOY6ZDPZR03FGCE5C1S9J5GIH2TFH1H6QPMX7X-645063384-1521329357567\", \"WBFOY6ZDPZR03FGCE5C1S9J5GIH2TFH1H6QPMX7X-645063384-1521329357631\", \"WBFOY6ZDPZR03FGCE5C1S9J5GIH2TFH1H6QPMX7X-645063384-1521329357734\", \"WBFOY6ZDPZR03FGCE5C1S9J5GIH2TFH1H6QPMX7X-645063384-1521329357870\", \"WBFOY6ZDPZR03FGCE5C1S9J5GIH2TFH1H6QPMX7X-645063384-1521329357976\", \"WBFOY6ZDPZR03FGCE5C1S9J5GIH2TFH1H6QPMX7X-645063384-1521329358012\", \"WBFOY6ZDPZR03FGCE5C1S9J5GIH2TFH1H6QPMX7X-645063384-1521329358048\", \"WBFOY6ZDPZR03FGCE5C1S9J5GIH2TFH1H6QPMX7X-645063384-1521329358084\", \"WBFOY6ZDPZR03FGCE5C1S9J5GIH2TFH1H6QPMX7X-645063384-1521329358155\", \"WBFOY6ZDPZR03FGCE5C1S9J5GIH2TFH1H6QPMX7X-645063384-1521329358191\", \"WBFOY6ZDPZR03FGCE5C1S9J5GIH2TFH1H6QPMX7X-645063384-1521329358227\"], \"plate_indexes\": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], \"travel_direction\": 255.1732177734375, \"country\": \"eu\", \"best_plate_number\": \"AF22454\", \"best_region_confidence\": 91.45714569091797, \"agent_version\": \"2.5.103\", \"candidates\": [{\"matches_template\": 0, \"plate\": \"AF22454\", \"confidence\": 94.99976348876953}, {\"matches_template\": 0, \"plate\": \"AF2245\", \"confidence\": 69.99081420898438}, {\"matches_template\": 0, \"plate\": \"AF224\", \"confidence\": 68.92207336425781}, {\"matches_template\": 0, \"plate\": \"A22454\", \"confidence\": 65.7693099975586}, {\"matches_template\": 0, \"plate\": \"AY22454\", \"confidence\": 65.72945404052734}, {\"matches_template\": 0, \"plate\": \"AT22454\", \"confidence\": 65.69474029541016}]}"

Если я посмотрю на вывод на тестовом сайте WebHook ( http://webhoot.site/), я получу такой результат:

{
  "epoch_start": 1521286407536,
  "camera_id": 645063384,
  "frame_start": 109416,
  "agent_uid": "WBFOY6ZDPZR03FGCE5C1S9J5GIH2TFH1H6QPMX7X",
  "best_confidence": 94.99918365478516,
  "company_id": "d1806fef-5549-4915-86a8-1b1f975e8df9",
  "version": 2,
  "agent_type": "alprd",
  "best_plate": {
    "plate": "AF25463",
    "confidence": 94.99918365478516,
    "region_confidence": 99,
    "vehicle_region": {
      "y": 1,
      "x": 80,
      "height": 479,
      "width": 479
    },
    "region": "eu-dk",
    "plate_index": 0,
    "processing_time_ms": 40.263999938964844,
    "candidates": [
      {
        "matches_template": 0,
        "plate": "AF25463",
        "confidence": 94.99918365478516
      }
    ],
    "coordinates": [
      {
        "y": 248,
        "x": 286
      },
      {
        "y": 251,
        "x": 599
      },
      {
        "y": 318,
        "x": 599
      },
      {
        "y": 314,
        "x": 286
      }
    ],
    "matches_template": 0,
    "requested_topn": 10
  },
  "vehicle": {
    "orientation": [
      {
        "confidence": 48.20035171508789,
        "name": "270"
      },
      {
        "confidence": 26.80327606201172,
        "name": "225"
      },
      {
        "confidence": 10.317419052124023,
        "name": "315"
      },
      {
        "confidence": 5.075159072875977,
        "name": "180"
      },
      {
        "confidence": 4.022528648376465,
        "name": "0"
      }
    ],
    "color": [
      {
        "confidence": 89.68812561035156,
        "name": "blue"
      },
      {
        "confidence": 3.044862747192383,
        "name": "silver-gray"
      },
      {
        "confidence": 2.5986762046813965,
        "name": "white"
      },
      {
        "confidence": 2.5680367946624756,
        "name": "green"
      },
      {
        "confidence": 0.8009989857673645,
        "name": "purple"
      }
    ],
    "make": [
      {
        "confidence": 11.725887298583984,
        "name": "renault"
      },
      {
        "confidence": 10.687095642089844,
        "name": "land-rover"
      },
      {
        "confidence": 9.455676078796387,
        "name": "nissan"
      },
      {
        "confidence": 7.793033123016357,
        "name": "citroen"
      },
      {
        "confidence": 6.8527727127075195,
        "name": "suzuki"
      }
    ],
    "body_type": [
      {
        "confidence": 19.176368713378906,
        "name": "suv-crossover"
      },
      {
        "confidence": 18.331125259399414,
        "name": "suv-standard"
      },
      {
        "confidence": 18.325965881347656,
        "name": "truck-standard"
      },
      {
        "confidence": 11.761542320251465,
        "name": "sedan-wagon"
      },
      {
        "confidence": 10.666444778442383,
        "name": "sedan-compact"
      }
    ],
    "year": [
      {
        "confidence": 19.741708755493164,
        "name": "2005-2009"
      },
      {
        "confidence": 17.747791290283203,
        "name": "2000-2004"
      },
      {
        "confidence": 16.381860733032227,
        "name": "1995-1999"
      },
      {
        "confidence": 13.306379318237305,
        "name": "1985-1989"
      },
      {
        "confidence": 11.591310501098633,
        "name": "1980-1984"
      }
    ],
    "make_model": [
      {
        "confidence": 7.200094223022461,
        "name": "land-rover_defender"
      },
      {
        "confidence": 2.6545894145965576,
        "name": "land-rover_discovery"
      },
      {
        "confidence": 1.7968538999557495,
        "name": "toyota_land-cruiser"
      },
      {
        "confidence": 1.6618626117706299,
        "name": "suzuki_sj-samurai"
      },
      {
        "confidence": 1.4205354452133179,
        "name": "suzuki_vitara"
      }
    ]
  },
  "best_uuid": "WBFOY6ZDPZR03FGCE5C1S9J5GIH2TFH1H6QPMX7X-645063384-1521286410173",
  "epoch_end": 1521286411970,
  "best_image_width": 640,
  "data_type": "alpr_group",
  "best_image_height": 480,
  "frame_end": 109536,
  "is_parked": false,
  "web_server_config": {
    "agent_label": "DESKTOP-B3PMA1C",
    "camera_label": "WebCamHKA"
  },
  "best_region": "eu-dk",
  "uuids": [
    "WBFOY6ZDPZR03FGCE5C1S9J5GIH2TFH1H6QPMX7X-645063384-1521286407536",
    "WBFOY6ZDPZR03FGCE5C1S9J5GIH2TFH1H6QPMX7X-645063384-1521286407571",
    "WBFOY6ZDPZR03FGCE5C1S9J5GIH2TFH1H6QPMX7X-645063384-1521286407607",
    "WBFOY6ZDPZR03FGCE5C1S9J5GIH2TFH1H6QPMX7X-645063384-1521286407783",
    "WBFOY6ZDPZR03FGCE5C1S9J5GIH2TFH1H6QPMX7X-645063384-1521286407888",
    "WBFOY6ZDPZR03FGCE5C1S9J5GIH2TFH1H6QPMX7X-645063384-1521286407991",
    "WBFOY6ZDPZR03FGCE5C1S9J5GIH2TFH1H6QPMX7X-645063384-1521286408267",
    "WBFOY6ZDPZR03FGCE5C1S9J5GIH2TFH1H6QPMX7X-645063384-1521286408301",
    "WBFOY6ZDPZR03FGCE5C1S9J5GIH2TFH1H6QPMX7X-645063384-1521286408335",
    "WBFOY6ZDPZR03FGCE5C1S9J5GIH2TFH1H6QPMX7X-645063384-1521286408579",
    "WBFOY6ZDPZR03FGCE5C1S9J5GIH2TFH1H6QPMX7X-645063384-1521286408649",
    "WBFOY6ZDPZR03FGCE5C1S9J5GIH2TFH1H6QPMX7X-645063384-1521286408860",
    "WBFOY6ZDPZR03FGCE5C1S9J5GIH2TFH1H6QPMX7X-645063384-1521286408895",
    "WBFOY6ZDPZR03FGCE5C1S9J5GIH2TFH1H6QPMX7X-645063384-1521286408930",
    "WBFOY6ZDPZR03FGCE5C1S9J5GIH2TFH1H6QPMX7X-645063384-1521286408964",
    "WBFOY6ZDPZR03FGCE5C1S9J5GIH2TFH1H6QPMX7X-645063384-1521286408999",
    "WBFOY6ZDPZR03FGCE5C1S9J5GIH2TFH1H6QPMX7X-645063384-1521286409173",
    "WBFOY6ZDPZR03FGCE5C1S9J5GIH2TFH1H6QPMX7X-645063384-1521286409278",
    "WBFOY6ZDPZR03FGCE5C1S9J5GIH2TFH1H6QPMX7X-645063384-1521286409417",
    "WBFOY6ZDPZR03FGCE5C1S9J5GIH2TFH1H6QPMX7X-645063384-1521286409484",
    "WBFOY6ZDPZR03FGCE5C1S9J5GIH2TFH1H6QPMX7X-645063384-1521286409651",
    "WBFOY6ZDPZR03FGCE5C1S9J5GIH2TFH1H6QPMX7X-645063384-1521286409789",
    "WBFOY6ZDPZR03FGCE5C1S9J5GIH2TFH1H6QPMX7X-645063384-1521286409823",
    "WBFOY6ZDPZR03FGCE5C1S9J5GIH2TFH1H6QPMX7X-645063384-1521286409999",
    "WBFOY6ZDPZR03FGCE5C1S9J5GIH2TFH1H6QPMX7X-645063384-1521286410036",
    "WBFOY6ZDPZR03FGCE5C1S9J5GIH2TFH1H6QPMX7X-645063384-1521286410140",
    "WBFOY6ZDPZR03FGCE5C1S9J5GIH2TFH1H6QPMX7X-645063384-1521286410173",
    "WBFOY6ZDPZR03FGCE5C1S9J5GIH2TFH1H6QPMX7X-645063384-1521286410208",
    "WBFOY6ZDPZR03FGCE5C1S9J5GIH2TFH1H6QPMX7X-645063384-1521286410646",
    "WBFOY6ZDPZR03FGCE5C1S9J5GIH2TFH1H6QPMX7X-645063384-1521286410751",
    "WBFOY6ZDPZR03FGCE5C1S9J5GIH2TFH1H6QPMX7X-645063384-1521286410887",
    "WBFOY6ZDPZR03FGCE5C1S9J5GIH2TFH1H6QPMX7X-645063384-1521286410923",
    "WBFOY6ZDPZR03FGCE5C1S9J5GIH2TFH1H6QPMX7X-645063384-1521286410957",
    "WBFOY6ZDPZR03FGCE5C1S9J5GIH2TFH1H6QPMX7X-645063384-1521286411099",
    "WBFOY6ZDPZR03FGCE5C1S9J5GIH2TFH1H6QPMX7X-645063384-1521286411169",
    "WBFOY6ZDPZR03FGCE5C1S9J5GIH2TFH1H6QPMX7X-645063384-1521286411204",
    "WBFOY6ZDPZR03FGCE5C1S9J5GIH2TFH1H6QPMX7X-645063384-1521286411523",
    "WBFOY6ZDPZR03FGCE5C1S9J5GIH2TFH1H6QPMX7X-645063384-1521286411626",
    "WBFOY6ZDPZR03FGCE5C1S9J5GIH2TFH1H6QPMX7X-645063384-1521286411694",
    "WBFOY6ZDPZR03FGCE5C1S9J5GIH2TFH1H6QPMX7X-645063384-1521286411797",
    "WBFOY6ZDPZR03FGCE5C1S9J5GIH2TFH1H6QPMX7X-645063384-1521286411970"
  ],
  "plate_indexes": [
    0,
    0,
    0,
    0,
    0,
    0,
    0,
    0,
    0,
    0,
    0,
    0,
    0,
    0,
    0,
    0,
    0,
    0,
    0,
    0,
    0,
    0,
    0,
    0,
    0,
    0,
    0,
    0,
    0,
    0,
    0,
    0,
    0,
    0,
    0,
    0,
    0,
    0,
    0,
    0,
    0
  ],
  "travel_direction": 18.316375732421875,
  "country": "eu",
  "best_plate_number": "AF25463",
  "best_region_confidence": 97.08333587646484,
  "agent_version": "2.5.103",
  "candidates": [
    {
      "matches_template": 0,
      "plate": "AF25463",
      "confidence": 94.99918365478516
    },
    {
      "matches_template": 0,
      "plate": "AF2546",
      "confidence": 70.50904846191406
    },
    {
      "matches_template": 0,
      "plate": "AF254",
      "confidence": 68.68018341064453
    },
    {
      "matches_template": 0,
      "plate": "AF254AF",
      "confidence": 65.75811767578125
    },
    {
      "matches_template": 0,
      "plate": "A25463",
      "confidence": 65.72001647949219
    },
    {
      "matches_template": 0,
      "plate": "AE25463",
      "confidence": 65.68501281738281
    }
  ]
}

РЕДАКТИРОВАТЬ: Оооо - я не могу опубликовать изображение. Мне нужно как минимум 10 репутации, чтобы опубликовать это. Но я могу дать ссылку на него здесь: https://klitandersen-my.sharepoint.com/:i:/g/personal/henrik_klit-andersen_com/Ec7DQkhrcFhAgZ6wIF24MbkBgrPcbXsgSa7_msXLZDHXQw?e=cnluHm

1 ответ

Похоже, я был на правильном пути, думая, что это потому, что у вас есть [FromBody] string value Параметр в вашем методе контроллера. Это, похоже, смещает буфер содержимого на 1024 байта, поэтому ваша попытка прочитать его как строку внутри тела метода дала только часть исходного тела запроса.

Вы можете попробовать несколько вещей здесь (по крайней мере, это те, которые я могу придумать). Во-первых, вы должны попытаться удалить параметр из. Это решило бы эту проблему сразу же, и вы могли бы просто прочитать ее без проблем, как вы пытались сейчас, всего одной строкой.

        var postBodyString = Request.Content.ReadAsStringAsync().Result;

Во-вторых, вы можете попытаться прочитать его как поток и сбросить позицию потока. Если вы используете эту опцию - убедитесь, что вы используете using так что все утилизируется, как только вы закончите. Я точно знаю, что это не сработало для меня некоторое время назад, потому что ReadAsStreamAsync() в Web Api является HttpBufferlessStream и я думаю, что это не поддерживает Seek операция.

        var postStream = Request.Content.ReadAsStreamAsync().Result;
        postStream.Seek(0, SeekOrigin.Begin);
        var postBodyString = new StreamReader(postStream).ReadToEnd();

Наконец, вы можете попробовать и сделать параметр HttpMessageRequest который вы могли бы затем прочитать в виде строки.

    [Route("somePost")]
    [HttpPost]
    public IHttpActionResult DoSomething(HttpRequestMessage request)
    {
        var str = request.Content.ReadAsStringAsync().Result;
        return Ok();
    }

Надеемся, что некоторые из этих вариантов будут приемлемы для вас или, по крайней мере, приведут вас на правильный путь.

Другие вопросы по тегам