如何通过与RPC样式服务相对的REST服务添加新数据?

时间:2009-01-10 20:17:40

标签: c# wcf rest

我还在学习REST,在我的测试中,他提出了这个我不知道如何处理的场景。

我有一个使用Linq-to-Sql的现有示例WCF服务。它是一个非常简单的数据库,带有一个名为“Tasks”的表,它有四个字段:Id,Description,IsCompleted和EnteredDate。 (我之所以提到这是因为我没有在服务本身中定义数据合约,它都来自Linq创建的Context。)

获取数据对于转换为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();
    }

Id是一个标识,因此由数据库处理。

我的第一个想法是装饰这样的操作合同:

    [WebInvoke(Method="PUT", UriTemplate="tasks/{description}")]
    [OperationContract]
    void AddTask(string description);

但我真的不知道如何让它发挥作用。当我尝试使用Fiddler添加它时,它返回结果411(需要长度)。

这样做的正确方法是什么?我是否必须重新编写实现以接受表示新记录的整个XML文档?

5 个答案:

答案 0 :(得分:3)

结果:

我终于找到了一个帮助我解决这个问题的nice blog post。事实证明我几乎正在做正确的事情,但我正在不正当地将测试放入Fiddler。我还在属性中添加了一些细节。

[WebInvoke(RequestFormat = WebMessageFormat.Xml, 
           ResponseFormat = WebMessageFormat.Xml,
           Method = "POST", UriTemplate = "tasks/{description}", 
           BodyStyle = WebMessageBodyStyle.Bare)]
[OperationContract]
void AddTask(string description);

当我把我的Uri放入Fiddler时,它需要看起来像这样:

http://ipv4.fiddler:8054/tasks/this+is+a+sample+desc+that+works

现在我的服务正确接受数据并可以将任务添加到数据库中。

答案 1 :(得分:1)

查看WCF REST Starter Kit,可以从CodePlex here下载。

答案 2 :(得分:0)

我认为this几乎描述了如何以一种宁静的方式将一个项目添加到容器中。

答案 3 :(得分:0)

根据要求,您只需通过Astoria启用常规CRUD即可?我有一系列文章介绍如何使用LINQ-to-SQL here执行此操作。只是一个想法。

答案 4 :(得分:0)

如果要执行RESTful Web服务,请不要使用WCF应用程序。将您的URI模板修改为Task / new,并将新任务的数据放在POST http请求的主体中。我在ASP.NET中实现RESTful Web服务作为通用处理程序(* .ashx)。这允许我准备http方法并从那里开始。

凯文