2014-09-27 120 views
2

我有一個OData v4操作方法,它不工作;但是請注意,這是在OData v3工作正常(我顯然在試圖更新我的項目的過程)Web API 2:OData 4:操作返回404

OData的操作方法:

[HttpPost] 
public Translation Translate(ODataActionParameters parameters) 
{ 
    // Implementation 
} 

配置:

ODataModelBuilder builder = new ODataConventionModelBuilder(); 
builder.EntitySet<Page>("Pages"); 
//etc (Other Entity Sets) 

var pageEntityType = builder.EntityType<Page>(); 
var translateAction = pageEntityType.Collection.Action("Translate"); 
translateAction.Parameter<Guid>("pageId"); 
translateAction.Parameter<string>("cultureCode"); 
translateAction.Returns<Translation>(); 

//etc (Other Actions) 

var route = config.MapODataServiceRoute("OData_CMS", "odata/cms", builder.GetEdmModel()); 

客戶端AJAX呼叫:

var data = { 
    pageId: $("#CultureSelector_PageId").val(), 
    cultureCode: $("#CultureSelector_CultureCode").val() 
}; 

$.ajax({ 
    url: "/odata/cms/Pages/Translate", 
    type: "POST", 
    contentType: "application/json; charset=utf-8", 
    data: JSON.stringify(data), 
    dataType: "json", 
    async: false 
}) 
.done(function (json) { 
    //etc 

我想看看是否有什麼改變了有關設置在4版本的OData行動,但它似乎是相同的(參見:Actions and Functions in OData v4 Using ASP.NET Web API 2.2

編輯

我發現OData v4用途一個Default命名空間並實現了,具體如下:

首先,僅僅通過改變我的AJAX調用:

url: "/odata/cms/Pages/Default.Translate",

這並沒有工作,所以我也補充道:

[ODataRoute("Default.Translate")]

[EnableQuery(AllowedQueryOptions = AllowedQueryOptions.All)]

我的行動,按照這個鏈接的說明:http://damienbod.wordpress.com/2014/06/16/web-api-and-odata-v4-crud-and-actions-part-3/ ..

也無法正常工作..我遵循了這封信的步驟......要麼我在這裏失明並且錯過了某些東西,要麼在的最新版本中存在嚴重問題爲Web API

+0

檢查此[post](http://stackoverflow.com/questions/32063196/odata-v4-function-always-returns-404/39438274#39438274)的解決方案。 – rdhainaut 2016-09-12 15:25:41

+0

如果你想要一個完整的解決方案, 檢查此[答案](http://stackoverflow.com/questions/32063196/odata-v4-function-always-returns-404/39438274#39438274);)EtVoilà – rdhainaut 2016-09-12 15:27:33

回答

0

那麼,這是幾乎一年後,這個問題,我實際上試圖再次移動到OData v4並有同樣的問題。我在這裏忘記了我原來的問題,並問了一個新問題,然後找到了答案。有關更多詳情,請參閱OData v4 Function always returns 404。我很高興地說現在一切都很好。

5

這可能是由於IIS的路由慣例引起的,當Uri包含點時它將具有自己的路由規則。然而,在odata v4中,所有的函數/動作調用都需要名稱空間限定。然後在這樣的Uri中會出現一個點,這將被IIS錯誤處理。

爲了擺脫這一點,你可以嘗試以下兩種的:

  1. 打開runAllManagedModulesForAllRequests,加上Web.config中的以下

    <system.webServer>
        <模塊runAllManagedModulesForAllRequests =「true」/ >
    </system。web服務器>

但有一點是該選項的一些潛在的問題,請參見本post查看詳細。

  • 打開項目特定的設置,添加Web.config中的以下內容:

    <system.webServer>
            <處理程序>
                    <刪除 名稱= 「ExtensionlessUrlHandler集成-4.0」  />
                    <添加 名= 「ExtensionlessUrlHandler集成-4.0」  路徑= 「的OData/CMS *」  動詞= 「*」  類型= 「System.Web.Handlers.TransferRequestHandler」  前提= 「integratedMode,runtimeVersionv4.0」  />
            < /處理程序>
    </system.webServer>

  • +0

    謝謝。目前,我必須回滾到v3,因爲我有很多工作要做。但是我會盡快嘗試這個解決方案..在接下來的幾天裏,可能會回到你身邊。欣賞這個建議,再次感謝。 – Matt 2014-09-30 00:49:56

    +0

    我發現ExtensionlessHandler-Integrated-4.0的處理程序已經存在於web.config中,但它的原始路徑=「*。」,無法正常工作。如果你只是添加path =「*。*」,它可以處理odata路由的任何路徑。這樣你就不會將它限制爲「odata/cms」。 – 2017-06-15 04:24:29

    3

    我有同樣的問題,我解決了加入尾隨斜槓的URL。在你的情況下,這將是/ odata/cms/Pages/Translate/

    0

    您是否使用Entity Framework Database First Approuche?看看導航屬性,在他們可能持有的序列化時間。在我的情況下,我刪除所有的導航屬性只是爲了測試,它的工作原理。