1

Я использую пользовательский oauth в веб-API для аутентификации. Теперь я хочу вызвать метод web api из контроллера MVC. Web метод API:Вызов web api C#, передавая маркер oauth вместе с параметром

public class UserController : ApiController 
{ 
    [Authorize(Roles = "Admin")] 
    [HttpPost] 
    [ActionName("UserById")] 
    public IEnumerable GetUserById(string idValue) 
    { 
     long ID = idValue != "" ? Convert.ToInt64(idValue) : -1; 
     using (var db = new DataModelContext()) 
     { 
      IEnumerable query = (from b in db.User.Include(u => u.EmailAddresses).ToList() 
       where b.Id == ID 
       select new { b.Id, UserName = b.UserName, b.EmailAddresses }).ToList(); 

      return query; 
     } 
    } 
} 

MVC контроллер:

public class PagesController : Controller 
{ 
    public ActionResult GetUserById(long id) 
    { 
     string baseUrl = Common.GetAPIUrl(); 
     HttpClient client = new HttpClient(); 
     client.DefaultRequestHeaders.Accept.Clear(); 
     client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); 
     client.BaseAddress = new Uri(baseUrl); 
     client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", Common.GetoAuth().access_token); 

     var values = new JObject(); 
     values.Add("idValue",id.ToString()); 

     HttpContent content = new StringContent(values.ToString(), Encoding.UTF8, "application/json"); 

     HttpResponseMessage response = client.PostAsJsonAsync(baseUrl + "/api/User/UserById", content).Result; 

     string resultJSON = response.Content.ReadAsStringAsync().Result; 

     return View("UserDetail",resultJson); 
    } 
} 

Некоторые, как ее не работает, я не в состоянии исправить проблему, почему он не работает. Когда я вызываю прямой URL API от почтальона, он работает нормально. например http://localhost:55362/api/UserById/2 или http://localhost:55362/api/UserById?idvalue=2. он не работает только для вызова httpclient.

+0

Пожалуйста, объясните, что вы подразумеваете под «не работает». Что происходит? Выбрасывает исключение? Если да, то просьба сообщить подробности, –

+0

НЕТ, если это не исключение. Его возвращающее это сообщение: Не найден ресурс HTTP, соответствующий запросу URI 'http: // localhost: 49963/api/User/UserById На контроллере' Пользователь 'не найдено никаких действий, которые бы соответствовали имени' UserById ' –

ответ

0

Incase, если вы все еще застрял с этим вопросом. Пожалуйста, сделайте следующее, чтобы оно работало.

WebApiConfig: Действие Api должно прийти выше контроллер Route

 config.Routes.MapHttpRoute(
      name: "ActionApi", 
      routeTemplate: "api/{controller}/{Action}/{id}", 
      defaults: new { id = RouteParameter.Optional } 
     ); 

     config.Routes.MapHttpRoute(
      name: "DefaultApi", 
      routeTemplate: "api/{controller}/{id}", 
      defaults: new { id = RouteParameter.Optional } 
     ); 

О методе Api: Добавьте атрибут "FromBody" для параметра.

[Authorize(Roles = "Admin")] 
[HttpPost] 
[ActionName("UserById")] 
public IEnumerable GetUserById([FromBody]string idValue) 
{ 
    long ID = idValue != "" ? Convert.ToInt64(idValue) : -1; 
    using (var db = new DataModelContext()) 
    { 
     IEnumerable query = (from b in db.User.Include(u => u.EmailAddresses).ToList() 
      where b.Id == ID 
      select new { b.Id, UserName = b.UserName, b.EmailAddresses }).ToList(); 

     return query; 
    } 
} 

Позвольте мне знать, если это работает

0

Убедитесь, что вы включили CORS в файл webapiconfig.cs.

Кроме того, проверьте маршрут отображения

public static void Register(HttpConfiguration config) 
{ 
      var mvcSiteURL = "Define your MVC site URL here"; //Example: http://localhost:5906 

      var cors = new EnableCorsAttribute(mvcSiteURL, "*", "*"); 
      config.EnableCors(cors); 

      routes.MapHttpRoute(
           name: "ActionApi", 
          routeTemplate: "api/{controller}/{action}/{id}", 
           defaults: new { id = RouteParameter.Optional}); 
+0

Это не тот, уже CORS включен. Также без параметра работает простой вызов вызова. Для действия параметра возникла проблема. –

+0

Существует разница в uri, который вы пробовали в Postman и HttpClient. http client использует/api/User/UserById ", в то время как URL-адрес почтальона не использует UserById – Kalyan

+0

Я обновил свой ответ. Проверьте, есть ли у вас сопоставление маршрутов в соответствии с моим ответом и порядок отображения маршрута, если у вас есть более чем один. – Kalyan

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

  • Нет связанных вопросов^_^