JayData。 OData v.3 Action POST参数收到null

时间:2013-08-30 08:18:44

标签: c# javascript wcf odata jaydata

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

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

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

OData v.3标准不支持将参数作为正文的一部分传递给POST操作,而是expect them to be in the queryString part of the URI。也就是说,在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

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

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

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

您最好参考完整规范的protocol specification文件(在线内容不完整)。

根据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