Какой вариант лучше использовать REST WCF с помощью servicestack? - PullRequest
2 голосов
/ 05 ноября 2011

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

Я создал один REST WCF, используя Servicestack, и одна Модель (класс), как указано ниже

public class Perfmon
{
        public long id { get; set; }
        public string appliationId { get; set; }

        public string cpuUsage { get; set; }
        public string availableMemory { get; set; }
        .......
        .......
} 

Теперь я хотел бы сделать пост-звонок наэта служба формирует другой EXE-проект согласно ниже

 JsonServiceClient client = new JsonServiceClient("myserviceurl");
 RESTWCF.ServiceModel.Perfmon p = new RESTWCF.ServiceModel.Perfmon();
 var res = client.Post<RESTWCF.ServiceModel.Perfmon>("/perfmon", p);

Теперь у меня есть 2 варианта согласно ниже

1) Необходимо преобразовать XSD в класс и использовать объект этого для передачи в пост-запросеКак я уже задавал вопрос Как я могу преобразовать XSD-файл в C # Class Но я не смог сгенерировать класс, используя URL-адрес напрямую с помощью утилиты XSD.exe

2) Вручную передать строку json ЕслиУ меня есть строка json, тогда она выглядит как ниже

[{1:"22", 2:"123", 3:"60", ..... }] 

(где 1 для идентификатора, 2 для applicationid .. просто сократить строку json), затем мне нужно преобразовать ее в класс C # для передачи объекта вотправьте запрос, но мне все еще нужно найти способ сопоставления с (1, 2 ..)

2-й вариант немного сбивает с толку, но если я могу это сделать, то это мое требование клиента передать вручную строку json вотправьте запрос.

Пожалуйста, помогите мне выбрать лучший вариант, потому что в простом Rest WCF нам не нужно использовать ссылку на класс (модель) для отправки постового запроса.

Если это не имеет смысла, тогдаЯ могу уточнить это более подробно

Заранее спасибо

Ответы [ 2 ]

3 голосов
/ 05 ноября 2011

Не знаю, почему вы не смогли сгенерировать классы Model из XSD.exe - но это на самом деле не требуется.Обычный способ использования ServiceStack - это поместить все ваши классы ServiceModel (т.е. DTO) в отдельную сборку без зависимостей и использовать ее с одним из универсальных сервисных клиентов JSON / JSV / XML / SOAP.

Если бы вы получили файл XSD.exe для генерации классов DTO, он просто сгенерировал бы копию вашего ServiceModel.dll.Если вы не хотите отправлять им dll, просто дайте им исходный код DTO - это, в основном, то, что генерирует утилита XSD.exe (только чище, так как code-gen включает в себя множество шаблонов).

Так зачем проходить все дополнительные этапы сборки кода + поколения?особенно если у вас возникли проблемы с генерацией.

Оба варианта будут работать, наиболее идеальным было бы предоставление DTO со строгим типом и использование общих сервисных клиентов.

Если вы хотите вместо этого передать строку JSON, вам потребуется использовать чистый HTTP-клиент, например, HttpWebRequest или новый HttpClient .

* 1016.* Вызов веб-сервисов REST ServiceStack без моделей C #

Если вы не хотите вызывать веб-сервисы ServiceStack, используя ваши сервисные DTO или сгенерированные модели сервиса C # XSD.exe, чем вместо отправки JSON, используйте URL QueryString для GET запрашивает или отправляет стандартные пары значений ключа HTTP POST, например application / x-www-form-urlencoded для HTTP POST запросов.Запрос DTO автоматически заполняется любыми переменными, отправляемыми в данных формы QueryString или POST.

Общепринятым стандартом является использование curl или wget дляпокажите, как связаться с вашим веб-сервисом REST, поскольку его функционал и пользователи могут легко эмулировать запрос веб-сервиса с помощью своего любимого клиента HTTP.

curl -d "id=1&appliationId=2" http://example.com/myserviceurl/perfmon

См. Google Weather API дляпример этого.В противном случае вы можете просто задокументировать ваш REST apis , как это делает твиттер , и просто показать им примеры данных формы GET Query String или POST с примером вывода.

0 голосов
/ 05 ноября 2011

1> В вашем случае, если вы создаете класс с использованием XSD и если он собирается использовать Dynamic в вашем приложении, чем в этом случае, вы не сможете его использовать, потому что вы не получите его свойства, которые вы должныкарта в вашем приложении.2> Я думаю, что единственным решением является использование WCF со ссылкой на сервис в вашем приложении.В вашем случае, если вы используете

USING SERVICESTACK:

Главное - это ответ POST стека служб.Хотя мы отправляем «POST» в стек обслуживания, он принимает только запрос DTO.

JsonServiceClient client = new JsonServiceClient("myserviceurl");
            RESTWCF.ServiceModel.Perfmon p = new RESTWCF.ServiceModel.Perfmon();
            var res = client.Post<RESTWCF.ServiceModel.Perfmon>("/perfmon", p);

ограничивает вышеприведенное.Это код, который нам нужно сделать в консольном приложении.При отправке запроса POST требуется объект класса «perfmon».

Давайте рассмотрим, что у нас есть класс perfmon в консольном приложении.Тогда нам не нужно использовать строку JSON, потому что, если мы создаем строку JSON, мы также должны присвоить свойства классу, чтобы его можно было вставить в конец стека службы.(тогда почему вы хотите использовать JSON)

ИСПОЛЬЗОВАНИЕ RESTWCF:

Давайте теперь предположим тот же сценарий с использованием RESTWCF, который принимает запрос «GET», «POST» с использованием WebRequest,(обычный RESTWCF) В этом случае, конечно, нам не нужна ссылка (COPY) класса perfmon в exe агента Monitor.Теперь давайте предположим, что мы создадим строку JSON, как вы предложили

     WebRequest request = WebRequest.Create(your URL");
        request.ContentType = "application/json; charset=utf-8";
        request.Method = "POST";
        string json = "{\"Id\":1,\"2\":\"100\",\"3\":\"1000\"}";

. Выше 2 означает процессор, 3 - доступную память и т. Д. Но, если мы будем использовать такую ​​структуру JSON, это не будетприсваивать значения свойств (поскольку значение ключа JSON преобразуется в свойства класса C #) Наш класс Perfmon должен выглядеть следующим образом.

Конечно, ваш класс должен выглядеть следующим образом:

[DataContract(Name = "perfmon")]
public class Performance
{

    [DataMember(Order = 1)]
    public long Id
    {
        get;
        set;
    }
    [DataMember(Order = 2)]
    public string CpuUsage
    {
        get;
        set;
    }

    [DataMember(Order = 3)]
    public string AvailableMemory
    {
        get;
        set;
    }
}

Теперь, конечно, если мы создадим строку JSON, например….

string json = "{\" Id \ ": 1, \" CpuUsage \ ": \" 100 \ ", \" AvailableMemory \ ": \" 1000\ "}";

чем в этом случае, он работает и присваивает значения свойствам класса, но в этом случае строка будет иметь большую длину?

ТАК, Я Угадаю, что окончательное решение являетсяПЕРЕЙТИ С WCF С СЕРВИСНОЙ ССЫЛКОЙ ИЛИ опустить JSON и передать объект в стек обслуживания из exe, как показано ниже (КОПИЯ КЛАССА В ТРЕБОВАНИИ В EXE)

JsonServiceClient client = new JsonServiceClient("myserviceurl");
        RESTWCF.ServiceModel.Perfmon p = new RESTWCF.ServiceModel.Perfmon();
        var res = client.Post<RESTWCF.ServiceModel.Perfmon>("/perfmon", p);
...