1

übergeben. Ich verwende eine benutzerdefinierte OAUTH in der Web-API für die Authentifizierung. Jetzt möchte ich Web API-Methode von MVC-Controller aufrufen. Web-API-Methode:Rufen Sie web api C# auf, indem Sie einen OAUTH-Token zusammen mit dem Parameter

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-Controller:

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

Einige, wie seine nicht funktioniert, ich bin nicht in der Lage Problem zu beheben, warum seine nicht funktioniert. Wenn ich API direkte URL vom Postboten anrufe, funktioniert es gut. wie http://localhost:55362/api/UserById/2 oder http://localhost:55362/api/UserById?idvalue=2. Es funktioniert nicht nur für den Aufruf von httpclient.

+0

Bitte erklären, was Sie unter „nicht funktioniert“. Was ist los? Ist es eine Ausnahme? Wenn ja, geben Sie bitte die Details an, –

+0

NEIN es wirft keine Ausnahme. Es gibt diese Nachricht zurück: Es wurde keine HTTP-Ressource gefunden, die die Anfrage-URI 'http: // localhost: 49963/api/User/UserById Keine Aktion auf dem Controller' Benutzer 'gefunden wurde, die den Namen' UserById 'entspricht –

Antwort

0

Incase überprüfen, ob Sie noch mit dieser Frage stecken. Bitte machen Sie Folgendes, damit es funktioniert.

WebApiConfig: Aktion Api sollte

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

Auf der Api-Methode über die Controller Strecke kommen: Fügen Sie den "FromBody" -Attribut auf die Parameter.

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

Lassen Sie mich wissen, ob das funktioniert

0

Stellen Sie sicher, dass Sie CORS in Ihrer Datei webapiconfig.cs aktiviert haben.

Auch Ihre Trassierung

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

Das ist Nicht der Fall, schon ist CORS aktiviert. Auch ohne Parameter funktioniert der einfache Anruf. Nur das Problem trat bei der Parameteraktion auf. –

+0

Es gibt einen Unterschied in der uri, die Sie in Postman und HttpClient versucht haben. Der HTTP-Client verwendet/api/User/UserById ", während die Postman-URL keine UserById verwendet. – Kalyan

+0

Ich habe meine Antwort aktualisiert. Bitte überprüfen Sie, ob Sie die Routenkarte gemäß meiner Antwort und die Reihenfolge der Routenkartierung haben mehr als eins. – Kalyan

Verwandte Themen