6

我在我的 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

我该怎么做呢?

4

3 回答 3

5

如果用户未通过身份验证,则不应重定向。另一端通常没有交互式用户,因此您应该真正返回 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);
于 2012-07-31T09:46:08.650 回答
4

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

但...

鉴于您的 url 结构,我猜您的路由类似于:

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

然后鉴于此,我猜您的身份验证用户必须类似于:

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
            }));
于 2012-07-31T10:31:27.643 回答
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();

谢谢你们。

于 2012-07-31T10:55:42.697 回答