【问题标题】:How to route to a controller when controller is not recognized in first place in asp.net mvc?当在asp.net mvc中首先无法识别控制器时,如何路由到控制器?
【发布时间】:2019-09-18 02:37:42
【问题描述】:

我正在尝试创建一个 API 代理程序,以便前端可以使用给定的任何端点调用 api,在代理中我决定要执行哪个 URL。我有以下问题:

在我的前端,我使用以下 url 调用我的 API 代理:

http://localhost:54857/getClients

当我的 API 代理收到此请求时,它会立即返回一个错误,在此错误发生之前,我想将其重定向到与名称不匹配的控制器操作 getClients

前端代码请求调用我的 API 代理:

[HttpGet]
    public async Task<ActionResult> getCall()
    {
        string url = "http://localhost:54857/";
        string operation = "getClients";

        using (var client = new HttpClient())
        {
            //get logged in userID
            HttpContext context = System.Web.HttpContext.Current;
            string sessionID = context.Session["userID"].ToString();

            //Create request and add headers
            client.BaseAddress = new Uri(url);
            client.DefaultRequestHeaders.Accept.Clear();
            client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

            //Custom header
            client.DefaultRequestHeaders.Add("loggedInUser", sessionID);

            //Response
            HttpResponseMessage response = await client.GetAsync(operation);
            if (response.IsSuccessStatusCode)
            {
                string jsondata = await response.Content.ReadAsStringAsync();
                return Content(jsondata, "application/json");
            }
            return Json(1, JsonRequestBehavior.AllowGet);
        }
    }

我的 API 代理中的路由

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

        routes.MapRoute(
            name: "Default",
            url: "{controller=Redirect}/{action=RedirectApi}/{id}");
    }

API 代理控制器:

[System.Web.Http.AcceptVerbs("GET")]
    [System.Web.Http.HttpGet]
    public Customer RedirectApi()
    {
        Customer t = dbProducts.Customers
            .Where(h => h.customerID == 1)
            .FirstOrDefault();
        return t;
    }

当 api 方法 getClients 存在时,我还有一个过滤器:

public override void OnActionExecuting(HttpActionContext actionContext)
    {
        //Checks if header is method Get and has attribute
        if ((actionContext.Request.Method.Method == "GET") && (actionContext.Request.Headers.GetValues("loggedinUser").First() != null))
        {

        }
        base.OnActionExecuting(actionContext);
    }

在当前情况下(上面的代码)我收到一个错误,我的 API 代理中的代码甚至没有被执行。我想要实现的是,我将我的 API 代理中收到的任何给定请求重定向到我的 API 代理控制器,该控制器执行 RedirectApi() 方法。

希望有人能帮忙!

提前致谢!

【问题讨论】:

  • 你的错误是什么?
  • 如果您的路由不成功,则不会调用过滤器。中间件可以完成这项工作,但它必须位于中间件通道的最开始。
  • 我没有收到错误,它只是不执行 API Broker 控制器,因此我试图接收的数据是未定义的。
  • 所以你得到一个 404 状态码,对吧?

标签: c# asp.net-mvc rest api routes


【解决方案1】:

您可以在其他映射代码之后添加此代码:

routes.MapRoute(
"404-PageNotFound",
"{*url}",
new { controller = "Redirect", action = "RedirectApi" }
);

【讨论】:

    猜你喜欢
    • 2019-06-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-22
    • 2011-03-06
    • 2011-11-05
    • 2021-12-23
    相关资源
    最近更新 更多