2014-02-17 4 views
0

У меня есть 2 проекта C# asp.net. 1 является api. 1 потребляет этот api.Не удается получить доступ к методу apicontroller - возвращает 404

Мой апи:

public class MyApiController : ApiController 
{ 
    public dynamic ValidateToken(string token) 
    { 
     return myValidationMethod(token); 
    } 
} 

Потребляя мой апи из другого проекта:

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, где я потребляю АНИ, client.UploadString бросает System.Net.WebException - Пульт ДУ сервер возвратил ошибку: (404) Не найдено.

Когда я проверить ИПН с хромированным клиентом остального он работает с 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

вы уверены, что вы делаете POST? –

+0

@ Здравко Данев Да. Использование клиента хромового отдыха работает POST. Попытка с GET не делает. Также client.UploadString (url, parameters) использует POST. –

ответ

1

Я не думаю UploadString посылает данные как Params, поэтому двигатель маршрутизации на стороне 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); 
+0

Первый метод не работает, но второй сделал. Мне просто нужно добавить request.ContentLength = 0; –

1

WebClient.UploadString метод отправляет HTTP-POST метод. Вы пытались получить доступ к вашему APIController с помощью метода POST из тестового клиента? Я предполагаю, что ваш тестовый клиент отправил запрос GET, и он сработал.

Существует другой номер overload, где вы можете указать тип метода действия.

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

Правильно ли номер порта? поставить контрольные точки визуальной студии и скопировать URL-код из кода и попробовать это у вашего клиента-клиента – Shyju

+0

Все еще не удается. Я также попытался добавить те же заголовки от остального клиента, но это не сработало –

Смежные вопросы