RedirectToAction引发502 Bad Gateway

时间:2017-03-06 16:10:01

标签: asp.net asp.net-mvc asp.net-core

我有一个使用集成Windows身份验证的ASP.NET核心MVC应用程序,并调用托管在同一IIS服务器上的Web API(因此对于API调用使用WindowsIdentity模拟,这也需要身份验证)。大多数路由工作,但如果执行更新或创建操作,我尝试将用户重定向到新创建的项目,我得到502 Bad Gateway错误。 POST / PUT命令通过Web API并给出对MVC应用程序的响应,因此我认为这是一个IIS配置问题,或路由有问题。

[HttpPost]
public async Task<IActionResult> CreateIncident(Incident model)
{
    HttpResponseMessage response = null;
    var identity = User.Identity as WindowsIdentity;

    async Task Action()
    {
        response = await _service.CreateIncident(model);
    }
    async Task GetId()
    {
        model.IncidentTrackingRefId = await _service.GetNewIncidentId(model.IncidentCategoryLookupTableId,
            model.IncidentTypeLookupTableId);
    }

    await WindowsIdentity.RunImpersonated(identity.AccessToken, GetId);
    await WindowsIdentity.RunImpersonated(identity.AccessToken, Action);

    if (response == null) return RedirectToAction("Error", "Home");

    if (response.StatusCode == HttpStatusCode.Created)
    {
        return RedirectToAction("View", "Incidents", new { id = model.IncidentId });
    }
}

查看操作:

[HttpGet]
public async Task<IActionResult> View(int id)
{
    var identity = User.Identity as WindowsIdentity;

    async Task Action()
    {
        ViewBag.BusTypes = await _service.GenerateDropDown("/GetIncidentBusTypes");
    }

    Incident incident = null;

    async Task GetIncident()
    {
        incident = await _service.GetIncidentById(id);
    }

    await WindowsIdentity.RunImpersonated(identity.AccessToken, GetIncident);
    await WindowsIdentity.RunImpersonated(identity.AccessToken, Action);

    if (ViewBag.BusTypes == null || incident == null) return RedirectToAction("Error", "Home");
    return View(incident);
}

2 个答案:

答案 0 :(得分:1)

您无法在RedirectToAction中使用model。重定向到操作有这些重载:

RedirectToRouteResult RedirectToAction(string actionName);
RedirectToRouteResult RedirectToAction(string actionName, object routeValues);
RedirectToRouteResult RedirectToAction(string actionName, RouteValueDictionary routeValues);
RedirectToRouteResult RedirectToAction(string actionName, string controllerName);
RedirectToRouteResult RedirectToAction(string actionName, string controllerName, object routeValues);
RedirectToRouteResult RedirectToAction(string actionName, string controllerName, RouteValueDictionary routeValues);

意思是,你不能将整个对象传递给这个方法。

答案 1 :(得分:1)

无法使用RedirectToAction重定向到其他应用

假设您已以这种方式配置MVC路由

routes.MapRoute(
     "Default",
     "Support/{controller}/action-{action}/{id}",
     new { controller = "Default", action = "Index", id = "" }
);

然后,如果您在控制器中使用RedirectToAction

return RedirectToAction("View", "Incidents", new { id = model.IncidentId })

浏览器收到此回复

HTTP/1.1 302 Found
Location: http://example.com/Support/Incidents/action-View/123

但是,如果要重定向到另一个目标应用程序,那么处理请求的当前应用程序不知道目标应用程序中的路由表配置是什么 - 它根本不知道它是否正在使用MVC。 / p>

长话短说,如果您想使用Redirect重定向到其他应用。

示例:

return Redirect("~/../Application2/Incidents/View");