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

Kye*_*ica 7 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;
}
Run Code Online (Sandbox Code Playgroud)

JS:

//Fails
serviceClient.deleteFromService("order", order, function () { }, deleteFailed);
//Works
serviceClient.postToService("order", order, function () { }, deleteFailed);
Run Code Online (Sandbox Code Playgroud)

更新:

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

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

这样做的问题是,ServiceStack JS客户端使用与POST相同的逻辑创建DELETE请求,通过填充您将其发送到正文的数据(技术上是jQuery XHR dataprop),这意味着服务器无法使用获取客户端发送的消息.

我看对了吗?JS客户端的删除是否被破坏?

Dyn*_*lon 1

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

请参阅此相关问题:HTTP DELETE 请求是否允许实体主体?