簡體   English   中英

如何為異常的端點api配置設置路由?

[英]how to set routing for unusual endpoint api configuration?

我正在構建一個新的webapi以便在工作中使用。 我必須在哪里開發適合以下端點模式的webapi2應用程序

/file
/file/[data id]
/file/[data id]/documents
/file/[data id]/conditions

在我的控制器中,我有以下代碼:

public class FileController : ApiController
{
    [HttpPost]
    public HttpResponseMessage ImportFile()
    {
        var act = Request.Headers.Accept.ToString();

        // test content type for "application/vnd.exp"

        return Request.CreateResponse(HttpStatusCode.OK, $"Successful import @ {DateTime.Now}");
    }

    [HttpPatch]
    public HttpResponseMessage UpdateDataByFile(string dataId)
    {
        var act = Request.Headers.Accept.ToString();


        return Request.CreateResponse(HttpStatusCode.OK, "Successful save");
    }

    [HttpPatch]
    public HttpResponseMessage UpdateDataIntake(string dataId)
    {
        var act = Request.Headers.Accept.ToString();

        return Request.CreateResponse(HttpStatusCode.OK, "Successful save");
    }

    [HttpGet]
    public HttpResponseMessage GetDataConditionsForUser(string dataid)
    {
        var act = Request.Headers.Accept.ToString();

        return Request.CreateResponse(HttpStatusCode.OK, "Successful get");
    }
}

我的路由配置如下所示:

public class RouteConfig
{
    public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

        routes.MapHttpRoute(
            name: "Files1",
            routeTemplate: "{controller}/{action}"
        );

        routes.MapHttpRoute(
            name: "Files2",
            routeTemplate: "{controller}/{action}/{id}",
            defaults: new {id = RouteParameter.Optional}
        );


    }
}

我的問題是如何配置路由,使其與端點配置匹配

例如:“ https://something.com/file/123412/document

並擊中了正確的控制器方法?

真的很困惑如何在這樣的環境中設置路由。

你可以做這樣的事情-

        routes.MapHttpRoute(
            name: "File",
            routeTemplate: "file",
            defaults: new { controller = "File", action = "ImportFile" }
        );

        routes.MapHttpRoute(
            name: "FileUpdate",
            routeTemplate: "file/{dataId}",
            defaults: new { controller = "File", action = "UpdateDataByFile" }
        );

        routes.MapHttpRoute(
            name: "FileDocuments",
            routeTemplate: "file/{dataId}/documents",
            defaults: new { controller = "File", action = "UpdateDataIntake" }
        );

        routes.MapHttpRoute(
            name: "FileConditions",
            routeTemplate: "file/{dataId}/conditions",
            defaults: new { controller = "File", action = "GetDataConditionsForUser" }
        );

        routes.MapHttpRoute(
            name: "Files1",
            routeTemplate: "{controller}/{action}"
        );
        routes.MapHttpRoute(
            name: "Files2",
            routeTemplate: "{controller}/{action}/{id}",
            defaults: new {id = RouteParameter.Optional}
        );

這意味着您正在為每個操作使用自定義路由。 您僅將這些路由用於以“ file /”開頭的網址。 您有許多不同的方法可以執行此操作。

如果在這些模板中使用{controller}並刪除默認值:controller =“ File”,則將與其他控制器匹配。

如果您可以重命名控制器動作以匹配您的路由,則可以使它們適應某種模式,並在模板中使用{action}。

routes.MapHttpRoute(
            name: "File",
            routeTemplate: "{controller}/{dataId}/{action}",
            defaults: new {}
        );

如果您重命名了最后兩個動作,則這應該與它們匹配。


public class FileController : ApiController
{

    [HttpPatch]
    public HttpResponseMessage Documents(string dataId)
    {
        var act = Request.Headers.Accept.ToString();

        return Request.CreateResponse(HttpStatusCode.OK, "Successful save");
    }

    [HttpGet]
    public HttpResponseMessage Conditions(string dataid)
    {
        var act = Request.Headers.Accept.ToString();

        return Request.CreateResponse(HttpStatusCode.OK, "Successful get");
    }
}

如果您在該路線中設置了默認操作,則還可以匹配第二個操作

routes.MapHttpRoute(
            name: "File",
            routeTemplate: "{controller}/{dataId}/{action}",
            defaults: new { action = "UpdateDataByFile" }
        );

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM