【问题标题】:Call web api c# by passing oauth token along with parameter通过传递 oauth 令牌和参数来调用 web api c#
【发布时间】:2017-02-01 04:42:55
【问题描述】:

我在 Web API 中使用自定义 oauth 进行身份验证。现在我想从 MVC 控制器调用 web api 方法。 Web API 方法:

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

有些它不工作,我无法纠正为什么它不工作的问题。当我从邮递员调用 API 直接 URL 时,它工作正常。比如http://localhost:55362/api/UserById/2http://localhost:55362/api/UserById?idvalue=2。它不适用于仅 httpclient 调用。

【问题讨论】:

  • 请解释您所说的“不工作”是什么意思。怎么了?它是否抛出异常?如果有,请提供详细信息,
  • NO 它没有抛出异常。它返回此消息:未找到与请求 URI 'localhost:49963/api/User/UserById 匹配的 HTTP 资源在控制器“用户”上未找到与名称“UserById”匹配的操作

标签: asp.net-mvc asp.net-web-api httpwebrequest dotnet-httpclient asp.net-routing


【解决方案1】:

如果您仍然坚持这个问题。请执行以下操作以使其正常工作。

WebApiConfig:Action 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 Method:在参数中添加“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;
    }
}

让我知道这是否有效

【讨论】:

    【解决方案2】:

    确保您已在 webapiconfig.cs 文件中启用 CORS。

    另外,请验证您的路线映射

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

    【讨论】:

    • 不是这样,CORS 已经启用。也没有参数简单的动作调用正在工作。唯一的问题是参数操作。
    • 您在 Postman 和 HttpClient 中尝试过的 uri 存在差异。 http 客户端使用 /api/User/UserById",而邮递员 url 不使用 UserById
    • 我已经更新了我的答案。如果您有多个,请检查您是否有按照我的答案进行的路由映射以及路由映射的顺序。
    • 是的,那里的路由也是一样的。我更新了有问题的邮递员网址。它是 /api/UserById 而不是 /api/user
    • 您能否发布提琴手跟踪以获取请求和响应详细信息
    猜你喜欢
    • 2014-02-24
    • 1970-01-01
    • 2018-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-11
    相关资源
    最近更新 更多