无法访问apicontroller方法 - 返回404

时间:2014-02-17 18:57:39

标签: c# asp.net-mvc api

我有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);

2 个答案:

答案 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

模仿您使用Chrome客户端进行的测试
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);