2016-05-25 11 views
0

VS2015でOdataをテストするためのダミープロジェクトを作成しましたが、この問題の説明と同じ問題がありました。 。 Web API 2: OData 4: Actions returning 404ODataクエリは後ろにスラッシュを付けないとエラーが発生します

バインドされた関数へのクエリは、後ろにスラッシュを追加するまで404エラーを返します。たとえば、次のように

http://localhost:46092/odata/v1/Trips/Default.GetTripNameById - 404 http://localhost:46092/odata/v1/Trips/Default.GetTripNameById/ -

http://localhost:46092/odata/v1/Trips/Default.GetTripNameById(tripID=1)を期待通りに動作します$ =名前を選択する - 404 http://localhost:46092/odata/v1/Trips/Default.GetTripNameById(tripID=1)/ $ =名前を選択 -

はこれが原因で起こると想定されていない期待どおりに動作? Microsoftのマニュアルでは、末尾にスラッシュが必要であるとは言及されていません。その例は、スラッシュなしで動作するはずです。また、スラッガーのUIにはスラッシュを付けず、クエリーを実行しようとすると404が表示されます。

この現象の原因は何ですか?スラッシュなしで正常に動作するようにするにはどうすればよいですか?

TripsController.cs:

... 
    [HttpGet] 
    public IHttpActionResult GetTripNameById(int tripID) 
    { 
     return Ok(DemoDataSources.Instance.Trips.AsQueryable().Where(t => t.ID == tripID.ToString())); 
    } 

WebApiConfig.cs:

public static void Register(HttpConfiguration config) 
    { 
     config.MapHttpAttributeRoutes(); 

     config.MapODataServiceRoute("odata", "odata/v1", GetEdmModel()); 

DefaultODataBatchHandler(GlobalConfiguration.DefaultServer)); 
     config.EnsureInitialized(); 
    } 

    private static IEdmModel GetEdmModel() 
    { 
     ODataConventionModelBuilder builder = new ODataConventionModelBuilder(); 
     builder.EntitySet<Person>("People"); 
     builder.EntitySet<Trip>("Trips"); 

     builder.EntityType<Trip>().Collection.Function("GetTripNameById").Returns<string>().Parameter<int>("tripID"); 

     var edmModel = builder.GetEdmModel(); 
     return edmModel; 
    } 
+0

私もここからすべてのweb.configファイルの設定オプションを試してみました:http://stackoverflow.com/questions/11728846/dots- in-url-cause-404-as-asp-net-mvc-and-iisのようなもので、何の効果もありませんでした。 VS2015プロジェクトのweb.debug.configに追加していました。 – K48

+0

web.debug.configの場所が間違っています(以下の答えに記載されています)。今すぐ知っているように、プロジェクトをデプロイし、公開設定がソリューションの「デバッグ」設定を展開するように設定されている場合にのみ使用されます。 localhostの開発では、メインweb.configに表示されているものだけが利用されます – bkwdesign

答えて

1

それはWeb.debug.configが実際には無視されていることがわかる。ここ

は私のコードスニペットですVisual Studio。

web.configファイルにこのコードを追加した後、すべてが動作します:

<system.webServer> 
<handlers> 
    <!-- the following line is required for correct handling of dots in URLs--> 
    <add name="ApiURIs-ISAPI-Integrated-4.0" 
    path="/odata/*" 
    verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" 
    type="System.Web.Handlers.TransferRequestHandler" 
    preCondition="integratedMode,runtimeVersionv4.0" /> 
    <!-- end line for handling of dots--> 
</handlers> 
</system.webServer> 
関連する問題