2

モデルにバインドされておらず、バインドされていない関数のみを含む「ユーティリティ」コントローラーを作成しました。
次のような URL からこれを呼び出せるようにしたいと思います:
odata/Utilities/SomeMethod()

現在、次のように呼び出す必要があります:
odata/SomeMethod()

「ユーティリティ」のカスタム ルートを作成するにはどうすればよいですか?

私が試してみました:

[ODataRoutePrefix("Utilities")]
public class UtilitiesController : ODataController

私も試しました:

[ODataRoute("Utilities/SomeMethod()"]
public string SomeMethod()

しかし、これらはどちらもエラーをスローします

4

2 に答える 2

0
  1. コントローラー クラスを定義します。

    public class UtilitiesController : ODataController
    {
        [System.Web.Http.HttpGet]
        [ODataRoute("SomeMethod")]
        public string SomeMethod()
        {
            // add your code
        }
    }
    
  2. ルートをマッピングします。

    var config = new HttpConfiguration();
    
    var modelBuilder = new ODataConventionModelBuilder();
    
    modelBuilder.Function("SomeMethod").Returns<string>();
    
    config.MapODataServiceRoute("ODataRoute", "odata/Utilities", modelBuilder.GetEdmModel());
    
于 2017-01-11T15:34:53.643 に答える
0

これを実現するために、デフォルトのコントローラ セレクタをオーバーライドできます。DefaultHttpControllerSelector次のように継承する新しいクラスを作成できます。

public class CustomControllerSelector : DefaultHttpControllerSelector
{

    public override string GetControllerName(HttpRequestMessage request)
    {
        string controllerName = null;
        // I haven't tested this, but here you can decide whether you want to 
        //  route to your new controller or not
        if (request.ODataProperties().Path.PathTemplate == "~/UnboundFunction")
        {
            controllerName = "UtilitiesController";
        }
        else
        {
            controllerName = base.GetControllerName(request);
        }

        return controllerName;
    }
}

次に、コントローラーセレクターを次のように置き換えることができます。

config.Services.Replace(typeof(IHttpControllerSelector), new CustomControllerSelector());

これにより、すべてのリクエストに対して実行時に使用するコントローラーを選択できます

于 2017-01-10T13:28:16.677 に答える