我在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
我该怎么做?
答案 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();
谢谢大家。