JayData.OData v.3操作POST参数接收为空

JayData. OData v.3 Action POST parameters received as null

本文关键字:参数 POST OData 操作 JayData      更新时间:2023-09-26

My OData POST Action将参数接收为null,因为它将参数作为主体的一部分从JayData客户端获取,并期望它们作为URI的一部分。

我已经创建了一个基于WCF Data Services 5.6.0和Llblgen 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,

Raist

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

  • JayData积压
  • JayData Github问题列表

我认为您将操作服务操作混淆了。

操作可能会产生副作用,服务操作不得产生副作用。服务操作在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