2014-02-17 89 views
0

我有2个c#asp.net项目。 1是api。 1正在消耗这个API。无法访问apicontroller方法 - 返回404

我的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); 
     } 
    } 
} 

在项目2个,我消耗了API,client.UploadString抛出一个System.Net.WebException - 远程服务器返回错误:(404)未找到。

当我测试与铬其余客户端它的工作原理与http://localhost:1234/myapi/validatetoken?token=myToken

的API为什么Web客户端找不到呢?

解决

我这得益于合作,与一个小的变化@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

你确定你正在做一个POST做测试? –

+0

@ ZdravkoDanev是的。使用Chrome休息客户端POST可以工作。试用GET不会。另外client.UploadString(url,参数)使用POST。 –

回答

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

否则模仿您正在使用Chrome用户端使用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); 
+0

第一种方法不起作用,但第二种方法不起作用。我只需要添加request.ContentLength = 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); 
} 
+0

使用测试客户端,只有一个POST有效。我试着用你的超载,但它也没有工作。同样的例外。 –

+0

端口号是否正确?把视觉工作室的断点,并从代码复制网址,并尝试在您的休息客户端 – Shyju

+0

仍然失败。我也尝试从其他客户端添加相同的头文件,但该文件无效 –