我还在学习REST,在我的测试中,想出了这个我不知道如何处理的场景.
我有一个使用Linq-to-Sql的现有示例WCF服务.它是一个非常简单的数据库,带有一个名为"Tasks"的表,它有四个字段:Id,Description,IsCompleted和EnteredDate.(我之所以提到这是因为我没有在服务本身中定义数据合约,它都来自Linq创建的Context.)
获取数据对于转换为REST来说是微不足道的......就像删除数据一样.但是,插入新记录似乎并不容易.
我的RPC样式的合同操作如下所示:
[OperationContract]
void AddTask(string description);
Run Code Online (Sandbox Code Playgroud)
不需要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();
}
Run Code Online (Sandbox Code Playgroud)
Id是一个标识,因此由数据库处理.
我的第一个想法是装饰这样的操作合同:
[WebInvoke(Method="PUT", UriTemplate="tasks/{description}")]
[OperationContract]
void AddTask(string description);
Run Code Online (Sandbox Code Playgroud)
但我真的不知道如何让它发挥作用.当我尝试使用Fiddler添加它时,它返回结果411(需要长度).
这样做的正确方法是什么?我是否必须重新编写实现以接受表示新记录的整个XML文档?
结果:
我终于找到了一篇不错的博客文章,帮助我解决了这个问题。事实证明,我做的事情几乎是正确的,但我不正确地将测试放入 Fiddler 中。我还为我的属性添加了更多详细信息。
[WebInvoke(RequestFormat = WebMessageFormat.Xml,
ResponseFormat = WebMessageFormat.Xml,
Method = "POST", UriTemplate = "tasks/{description}",
BodyStyle = WebMessageBodyStyle.Bare)]
[OperationContract]
void AddTask(string description);
Run Code Online (Sandbox Code Playgroud)
当我将 Uri 放入 Fiddler 时,它需要如下所示:
http://ipv4.fiddler:8054/tasks/this+is+a+sample+desc+that+works
现在我的服务正确接受数据并可以将任务添加到数据库中。
| 归档时间: |
|
| 查看次数: |
759 次 |
| 最近记录: |