Отправка JSON в очередь Azure через ApiController

Я пытаюсь получить POST на ApiController в веб-API ASP.NET и добавить его в очередь Azure. Проблема, с которой я столкнулся, заключается в том, что я не хочу делать привязку параметра к свойствам класса на данный момент, а скорее ставлю JSON в очередь в виде строки в очереди Azure, чтобы я мог получить рабочую роль для обработки этого в своем собственное время.

Я использую Fiddler для выполнения POST, который выглядит так:

User-Agent: Fiddler
Host: localhost:50348
Content-Type: application/json
Content-Length: 34

С этим телом запроса:

{"text":"pineapple","user":"fred"}

А вот мой контроллер (немного упрощённый для ясности):

public class MessagesController : ApiController
{   
    // POST api/messages
    public void Post([FromBody] Message message)
    {
        var storage = CloudStorageAccount.DevelopmentStorageAccount;
        var queueClient = storage.CreateCloudQueueClient();
        var queue = queueClient.GetQueueReference("messages");
        if (queue.CreateIfNotExists())
        {
            Trace.WriteLine("Hello world for the first time");
        }

        var msg = new CloudQueueMessage(message.text);
        queue.AddMessage(msg);
    }

Это работает с классом Message, который выглядит так:

public class Message
{
    public string user { get; set; }
    public string text { get; set; }   
}

Все это работает нормально, но я просто хочу получить тело запроса (то есть JSON) и не привязывать его, а вместо этого добавить все это в очередь Azure в виде строки.

Любые идеи? Я что-то упустил или мой подход просто неверен?


person Neil Billingham    schedule 03.06.2015    source источник
comment
Вы хотите опубликовать {"text":"pineapple","user":"fred"} вместо pineapple в теле сообщения. Я прав?   -  person Gaurav Mantri    schedule 03.06.2015
comment
@GauravMantri да, верно, весь кусок JSON :)   -  person Neil Billingham    schedule 03.06.2015


Ответы (2)


Вы можете просто сериализовать свой объект, используя Json.Net, выполнив что-то вроде:

var serializedData = JsonConvert.SerializeObject(message);
var msg = new CloudQueueMessage(serializedData);
queue.AddMessage(msg);
person Gaurav Mantri    schedule 03.06.2015
comment
это работает, хотя кажется странным, что мне вообще нужно привязывать параметры, а затем сериализовать этот объект с помощью сторонней библиотеки. Мне кажется, что я что-то упускаю из-за чего-то, что кажется (по крайней мере мне) вполне нормальным паттерном. Я подожду, чтобы увидеть, появятся ли еще ответы, а затем отзывы :) - person Neil Billingham; 03.06.2015
comment
Json.Net — это один из способов сериализации объекта. Вы также можете использовать сериализатор .net для сериализации объекта. ХТН. - person Gaurav Mantri; 03.06.2015
comment
Думаю, у @Mahesh Jasti есть хорошая мысль. Наличие привязки параметра JSON несколько подтвердит структуру JSON :) Думаю, я выберу это решение :) - person Neil Billingham; 03.06.2015

Если это всегда строковый ввод, вы можете попробовать - (строковое значение [FromBody])

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

person Mahesh Jasti    schedule 03.06.2015