在Web API中使用RedirectToAction

时间:2012-07-31 09:28:36

标签: c# redirect asp.net-web-api redirecttoaction

我在ASP.Net WebAPI应用程序中使用RedirectToAction,并尝试了以下方法。

return RedirectToAction("AuthenticateUser", "AuthenticationServiceWebApi", new RouteValueDictionary
                                                                    {
                                                                        {"userName", model.UserName},
                                                                        {"password", model.Password}
                                                                    });

这将生成如下重定向。

127.0.0.1:81/authenticationservicewebapi/authenticateuser/admin/admin@123

但是,由于我使用的是WebAPI,我需要成为如下的URL。

127.0.0.1:81/api/authenticationservicewebapi/authenticateuser/admin/admin@123

我该怎么做?

3 个答案:

答案 0 :(得分:4)

如果用户未经过身份验证,则不应重定向。通常在另一端没有交互式用户,因此您应该真正返回HTTP状态代码401而不是重定向。


ASP.NET Web API中没有等效的内容。

如果您坚持这样做,那么它就是:

你抛出HttpResponseException

var httpResponseMessage = new HttpResponseMessage(HttpStatusCode.Found);
httpResponseMessage.Headers.Location = new Uri(myAddress, UriKind.Relative);
throw new HttpResponseException(httpResponseMessage);

答案 1 :(得分:4)

我不确定您的路由,Web API操作签名是什么样子,所以我会尝试猜测。 这里有一些事情没有真正加起来(你为什么要在网址中传递密码?)

但是...

考虑到你的网址结构,我猜你的路由是这样的:

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

然后考虑到这一点,我猜你的authenticateuser必须是:

public HttpResponseMessage AuthenticateUser([FromUri]string id, [FromUri]string id2)

如果是这样,那么从你需要的MVC控制器重定向到这个:

        return Redirect(
            Url.RouteUrl("DefaultApi", 
                new { httproute = "", 
                      controller = "AuthenticationServiceWebApi", 
                      action = "AuthenticateUser", 
                      id = model.UserName,
                      id2 = model.Password
            }));

答案 2 :(得分:0)

我还提出了一个简单的解决方案。如上所述不太好,但值得分享。

        string post_data = "userName=th&password=admin@123";

        string uri = "http://127.0.0.1:81/api/authenticationservicewebapi/authenticateuser";

        // create a request
        HttpWebRequest request = (HttpWebRequest)
        WebRequest.Create(uri); 
        request.KeepAlive = false;
        request.ProtocolVersion = HttpVersion.Version10;
        request.Method = "POST";

        // turn our request string into a byte stream
        byte[] postBytes = Encoding.ASCII.GetBytes(post_data);

        // this is important - make sure you specify type this way
        request.ContentType = "application/x-www-form-urlencoded";
        request.ContentLength = postBytes.Length;
        Stream requestStream = request.GetRequestStream();

        // now send it
        requestStream.Write(postBytes, 0, postBytes.Length);
        requestStream.Close();

谢谢大家。