1

我的 OData POST 操作将参数接收为 null,因为它从 JayData 客户端获取它们作为正文的一部分,并期望它们作为 URI 的一部分。

我创建了一个基于WCF Data Services 5.6.0Llblgen Pro 4.0的 OData 服务(只是目前最好的 .Net ORM)。它有一个 POST 动作:

[WebInvoke(Method = "POST")]
public void DeletePeople(string guidsToDelete) {...}

OData v.3 标准不支持将参数作为正文的一部分传递给 POST 操作,但希望它们位于 URI 的 queryString 部分中。也就是说,在 System.Data.Services.Client 中,您必须将它们设置为 UriOperationParameter 而不是 BodyOperationParameter。

我可以在 JayData 的 ServiceOperation 定义中配置将参数发送到哪里,还是我必须假设它现在不支持带参数的 POST?

// This works, of course :-)
// JayData client. EntityContext definitions. Changed to GET instead of POST
'DeletePeople': { type: $data.ServiceOperation, method: 'GET', params: [{ name: 'guidsToDelete', type: 'Edm.String' }] }

// Updated server operation (not action any more):
[WebGet]
public void DeletePeople(string guidsToDelete)

TIA,

赖斯特

4

2 回答 2

1

我认为您将ActionsService Operations混淆了。

动作可能有副作用,服务操作一定不能有副作用。服务操作在 OData v3.0 中被标记为旧功能,因为函数可以实现相同的结果。请注意,函数不使用 POST - 它们必须使用 GET 方法,因此在查询字符串中传递任何参数。

最好参考协议规范文档,它是完整的规范(网上的内容不完整)。

根据 OData v3.0 规范,与操作关联的任何参数都使用 POST 方法在请求正文(不是请求 URI)中传递。这是规范文档中的操作示例:

HTTP 请求:

POST /Customers('ALFKI')/SampleEntities.CreateOrder HTTP/1.1 Host: host
Content-Type: application/json;odata=verbose DataServiceVersion: 3.0
MaxDataServiceVersion: 3.0
If-Match: ...ETag...
Content-Length: ####
{
   "quantity": 2,
   "discountCode": "BLACKFRIDAY" 
}

HTTP 响应:

HTTP/1.1 204 OK
Date: Fri, 11 Oct 2008 04:23:49 GMT

</p>

于 2013-09-24T16:38:06.687 回答
1

JayData 期望WebGet现在通过属性发布服务操作。您对 OData 标准的看法是正确的,它确实期望 URL 参数中的 POST 操作的参数,但这很奇怪,因为经典的 WCF 和 WebAPI 在正文中都使用了参数……这是一个标准,所以必须遵循。如果您无法使用 WebGet 属性,请随时提出支持 POST 调用方法的功能:

于 2013-09-06T09:17:29.517 回答