Я все еще изучаю REST и в своем тесте придумал сценарий, с которым не знаю, как справиться.
У меня есть пример службы WCF, которая использует Linq-to-Sql. Это чрезвычайно простая база данных с одной таблицей под названием «Задачи», которая имеет четыре поля: Id, Description, IsCompleted и EnteredDate. (Я упоминал об этом, потому что в самой службе не определены контракты на данные, все это происходит из контекста, созданного Linq.)
Получение данных было тривиальным для преобразования в REST ... как удаление данных. Однако вставка новых записей выглядит не так просто.
Моя контрактная операция в стиле RPC выглядит следующим образом:
[OperationContract]
void AddTask(string description);
Id, IsCompleted и EnteredDate не нужны, поскольку реализация службы выглядит следующим образом:
public void AddTask(string description)
{
TaskListLinqDataContext db = new TaskListLinqDataContext();
Task task = new Task()
{ Description = description, IsCompleted = false,
EntryDate = DateTime.Now };
db.Tasks.InsertOnSubmit(task);
db.SubmitChanges();
}
Идентификатор является идентификатором и поэтому обрабатывается базой данных.
Моей первой мыслью было оформить контракт на операцию следующим образом:
[WebInvoke(Method="PUT", UriTemplate="tasks/{description}")]
[OperationContract]
void AddTask(string description);
Но я не знаю, как заставить это работать. Когда я пытаюсь использовать Fiddler, чтобы добавить это, он возвращает результат 411 (длина требуется).
Каков был бы правильный способ сделать это? Должен ли я переписать реализацию, чтобы принять весь документ XML, представляющий новую запись?