Передача объектов в RestSharp - PullRequest
0 голосов
/ 08 ноября 2018

Я полагаю, что я должен делать что-то явно неправильное в моем коде .NET, но не могу понять проблему.

У меня есть два приложения, которые общаются через вызовы RestSharp, и, независимо от того, что я пытаюсь сделать, значение POST, приходящее от одного приложения к другому, ВСЕГДА НЕДЕЙСТВИТЕЛЬНО. Вот мой код отправки:

            var client = new RestClient(_context.CloudUrl + ":" + _context.CloudPort.ToString() + "/api/web/AddRegisteredLocation");
            var request = new RestRequest(Method.POST);
            request.RequestFormat = DataFormat.Json;
            request.AddHeader("cache-control", "no-cache");
            request.AddParameter("application/json", JsonConvert.SerializeObject(myLocation, Formatting.None), ParameterType.RequestBody);

Я пытался .AddObject, .AddJsonBody, .AddBody - не использовать NewtonSoft.Json и даже передавать XML, но этот метод всегда получает значение NULL:

    [Route("AddRegisteredLocation")]
    [HttpPost()]
    public async Task<IActionResult> AddRegisteredLocation([FromBody] string NewStringLocation)
    {
        try
        {
            RegisteredLocation newLocation = JsonConvert.DeserializeObject<RegisteredLocation>(NewStringLocation);
            await _Manager.AddRegisteredLocation(newLocation);

            return new OkObjectResult(true);
        }
        catch (Exception exc)
        {
            eventWriter.WriteEntry("AddRegisteredLocation failed with the exception: " + exc.ToString(), System.Diagnostics.EventLogEntryType.Error);
            return new NotFoundResult();
        }

Я также попробовал этот метод:

    //POST: api/web/AddRegisteredLocation
    [Route("AddRegisteredLocation")]
    [HttpPost()]
    public async Task<IActionResult> AddRegisteredLocation([FromBody] RegisteredLocation NewLocation)
    {
        try
        {
            await _Manager.AddRegisteredLocation(NewLocation);

            return new OkObjectResult(true);
        }
        catch (Exception exc)
        {
            eventWriter.WriteEntry("AddRegisteredLocation failed with the exception: " + exc.ToString(), System.Diagnostics.EventLogEntryType.Error);
            return new NotFoundResult();
        }
    }

И я удалил тег [FromBody] - ничего не работает. Когда я иду по коду, входящее значение ВСЕГДА равно NULL.

Если я использую скрипт Postman и отправляю в необработанном JSON через POST-запрос, это прекрасно работает, поэтому должно быть что-то на стороне запроса, но я не могу понять это.

У кого-нибудь есть предложение?

1 Ответ

0 голосов
/ 15 ноября 2018

Как оказалось, виновником был Bson ObjectId - по какой-то причине ни один из сериализаторов не может справиться с этим. Есть опции BsonWriter и BsonReader, но обе они, по сути, используют Base64-кодировку, которая медленна и раздувает сообщения.

Чтобы быстро преодолеть эту проблему, я написал набор классов без BsonId, а затем набор методов, которые вручную копируют данные из классов, основанных на MongoDB, в классы, удобные для сериализации.

Это сработало отлично, и, с другой стороны, отсутствие идентификатора объекта не вызывает проблем с MongoDB. Я просто ищу объект по уникальному строковому имени и присваиваю идентификатор перед внесением каких-либо изменений.

Возможно, это НЕ самое элегантное решение, но оно работает!

...