2012-07-31 15 views
5

Estoy usando RedirectToAction en mi aplicación WebAPI de ASP.Net y probé la siguiente.Usar RedirectToAction en la API web

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

Esto genera la redirección de la siguiente manera.

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

Pero, dado que estoy usando WebAPI, necesito ser la URL como a continuación.

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

¿Cómo puedo hacer esto?

Respuesta

3

No estoy seguro de cómo su enrutamiento, Web API firma acción parezca así que intentaré adivinar. Algunas cosas realmente no se suman aquí (? ¿Por qué pasar la contraseña en la url)

pero ...

Dada la estructura de su URL supongo que el enrutamiento es algo así como:

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

a continuación, teniendo en cuenta que, supongo que su authenticateUser debe ser algo como:

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

Si es así, entonces para redirigir a esto desde un controlador MVC usted ne ed:

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

'RedirectToAction' es MVC no API web. – Aliostad

+0

Sí, puedes solucionarlo usando Redirect, que toma una cadena y pasa una url de ruta web Api acumulada con UrlHelper. No es bonito, pero no estoy seguro de lo que el OP está tratando de lograr. –

+0

Funciona bien, muchas gracias. – thilok

4

Si el usuario no está autenticado no debe redireccionar. Por lo general, no hay un usuario interactivo en el otro extremo, por lo que realmente debe devolver el código de estado HTTP 401 en lugar de redirigirlo.


No hay equivalente en ASP.NET Web API.

Si insiste hacerlo entonces aquí es:

Lanzas HttpResponseException:

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

Creo que no lo consiguió Señor. Lo que quiero es activar una acción de la API web utilizando este método. – thilok

+0

@thilok. También dudo que haya entendido lo que quise decir. Pero de todos modos aquí hay una actualización si insiste en hacerlo. – Aliostad

0

También encontré una solución simple. No muy bueno como el anterior, pero vale la pena compartirlo.

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

Gracias a todos.