ServiceStack DELETE请求是默认对象,POST工作正常

时间:2013-02-07 22:24:21

标签: c# servicestack

我有一个来自Javascript客户端的DTO。当我尝试使用deleteFromService发送时,请求对象是空的(看起来它只是新编辑的)。如果我将方法更改为postToService,则会正确填充请求对象。

我正在使用3.9 API。我在这里不知所措。

服务:

public object Post(Order request)
{
    return _orderRepository.InsertOrder(request);
}

public object Delete(Order request)
{
    _orderRepository.DeleteOrder(request.Uuid);
    return true;
}

JS:

//Fails
serviceClient.deleteFromService("order", order, function () { }, deleteFailed);
//Works
serviceClient.postToService("order", order, function () { }, deleteFailed);

更新

我在ServiceStack source code中发现了这个问题。它像处理GET一样处理DELETE并创建请求对象而不是正文,就像它对POST一样。

if (httpMethod == HttpMethods.Get || httpMethod == HttpMethods.Delete || httpMethod == HttpMethods.Options)
{
    try
    {
        return KeyValueDataContractDeserializer.Instance.Parse(queryString, operationType);
    }
}

执行此操作的问题在于ServiceStack JS client使用与POST相同的逻辑创建DELETE请求,方法是将数据填充到正文中(技术上是jQuery XHR data道具),意味着服务器无法获取客户端发送的消息。

我读到这个吗? JS客户端的删除是否已损坏?

2 个答案:

答案 0 :(得分:2)

我重写了servicestack.js客户端,在选项var初始化之前在P.Send函数中添加了以下行...

if (ajaxOptions.type === "DELETE") {
    requestUrl = requestUrl + "?" + decodeURIComponent($.param(request[webMethod]));
}

答案 1 :(得分:1)

DELETE消息不应携带消息正文,这意味着您只能将参数传递给url中的DELETE请求(即类似于要删除的对象的ID)。因此,除了ServiceStack之外,您不应该在DELETE请求中发送DTO。

请参阅此相关问题:Is an entity body allowed for an HTTP DELETE request?