2013-08-30 46 views
1

我的OData POST操作接收參數爲空,因爲它將它們從JayData客戶端作爲身體的一部分獲取,並期待它們作爲URI的一部分。JayData。 OData v.3操作收到的POST參數爲空

我已經創建了基於WCF Data Services 5.6.0Llblgen Pro 4.0(現在簡單地是the best .Net ORM)的OData服務。它有一個POST操作:

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

的OData的3.0版標準不支持參數傳遞到後的操作作爲身體的一部分,但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

回答

1

JayData預計通過WebGet屬性出版服務業務現在。你對OData標準是正確的,它確實需要URL參數中POST操作的參數,但這很奇怪,因爲經典的WCF和WebAPI都使用了體內的參數......這是一個標準,所以必須遵循。如果你不能使用WebGet屬性,可隨時提出,支持POST調用方法的特點:

+0

同意,從標準怪異的請求,如POST應該有,不僅是語義使用,也是功能性的(發送長參數值作爲身體的一部分) – raist

+0

注意:標準DOES支持POST操作(請參閱mixja答案和m y對它發表評論)。正如Robesz所說,事實是JayData現在不支持POST操作(v.1.3.1),只是GET服務操作。 – raist

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 

+0

你說得對。從您的鏈接到協議規範: 2.2.7.5.1調用操作請求。 「調用操作請求必須使用HTTP POST」。 – raist

+0

我一直認爲'服務操作'是一個WCF數據服務術語,它定義了開發者用來指定OData操作(通過'WebInvoke')和OData函數(通過'WebGet')使用的API。因此,OData操作和函數都是由WCF數據服務的「服務操作」實現的 - 這些概念並不衝突。你的答案也使得它聽起來像(無副作用)函數可以實現Actions所能做的一切,這是不正確的。在查詢字符串中攜帶大量數據也是非常錯誤的。我似乎無法找到您提到的棄用通知。 – tne