我有一个来自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客户端的删除是否已损坏?
答案 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?