我有2个c#asp.net项目。 1是api。 1正在消耗这个API。
我的api:
public class MyApiController : ApiController
{
public dynamic ValidateToken(string token)
{
return myValidationMethod(token);
}
}
从另一个项目中消耗我的api:
public class MyController : Controller
{
[HttpPost]
public ActionResult ValidateToken(string token)
{
var url = "http://localhost:1234/myapi/validatetoken";
var parameters = "token=" + token;
using (var client = new WebClient())
{
var result = client.UploadString(url, parameters);
return Json(result);
}
}
}
在我使用api的项目2中,client.UploadString抛出System.Net.WebException - 远程服务器返回错误:(404)Not Found。
当我使用chrome rest客户端测试api时,它与http://localhost:1234/myapi/validatetoken?token=myToken
为什么WebClient找不到它?
解决了
感谢@BrentMannering添加内容长度的小改动,我得到了这个工作:
var url = "http://localhost:1234/myapi/validatetoken?token=" + token;
var request = WebRequest.Create(url);
request.Method = "POST";
request.ContentLength = 0; //got an error without this line
var response = request.GetResponse();
var data = response.GetResponseStream();
string result;
using (var sr = new StreamReader(data))
{
result = sr.ReadToEnd();
}
return Json(result);
答案 0 :(得分:1)
WebClient.UploadString
方法发送Http POST 方法。您是否尝试使用测试客户端的POST方法访问APIController?我假设您的测试客户端发送了一个GET请求并且它有效。
有一个不同的overload,您可以在其中提及Action方法类型。
var url = "http://localhost:1234/myapi/validatetoken";
var parameters = "token=" + token;
string method = "GET"; //or POST as needed
using (var client = new WebClient())
{
var result = client.UploadString(url,method , parameters);
return Json(result);
}
答案 1 :(得分:1)
我认为UploadString
不会将数据作为参数发送,因此API端的路由引擎无法映射到某个动作,因此404.根据MSDN documentation方法编码在上传之前到Byte[]
,这可能是问题的一部分。
尝试使用UploadValues
方法
var url = "http://localhost:1234/myapi/validatetoken";
var nv = new NameValueCollection { { "token", token } };
using (var client = new WebClient())
{
var result = client.UploadValues(url, nv);
return Json(result);
}
否则,要使用WebRequest
var url = "http://localhost:1234/myapi/validatetoken?token=" + token;
var request = WebRequest.Create(url);
request.Method = "POST";
var data = request.GetResponse().GetResponseStream();
string result = String.Empty;
using (StreamReader sr = new StreamReader(data))
{
result = sr.ReadToEnd();
}
return Json(result);