Использовать RedirectToAction в веб-интерфейсе API

Я использую RedirectToAction в своем приложении ASP.Net WebAPI, и я попробовал следующее.

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

Это генерирует перенаправление, как показано ниже.

127.0.0.1:81/authenticationservicewebapi/authenticateuser/admin/[email protected]

Но, поскольку я использую WebAPI, мне нужно быть URL-адресом, как показано ниже.

127.0.0.1:81/api/authenticationservicewebapi/authenticateuser/admin/[email protected]

Как это сделать?

Ответ 1

Я не уверен, как выглядит ваша маршрутизация, подпись 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
            }));

Ответ 2

Если пользователь не аутентифицирован, вы не должны перенаправлять. Обычно на другом конце нет интерактивного пользователя, поэтому вы должны действительно возвращать код состояния 401 HTTP вместо перенаправления.


В ASP.NET Web API нет эквивалента.

Если вы настаиваете на, то вот оно:

Вы бросаете HttpResponseException:

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

Ответ 3

Я также придумал простое решение. Не очень хорошо, как выше, но стоит поделиться.

        string post_data = "userName=th&[email protected]";

        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();

Спасибо всем.