【问题标题】:Getting content-type from HttpActionContext从 HttpActionContext 获取内容类型
【发布时间】:2021-02-18 19:22:30
【问题描述】:

我正在尝试根据正文请求中传递的值对端点进行授权。例如,在请求的正文中传递了一个站点 ID,我想根据用户是否对该站点具有适当的权限来进行授权。

如果正文请求以 json 格式传递,我有这个工作,但如果它是 urlencoded 形式,则不是。而且我不知道如何事先找到它。这是我的代码的 sn-p,它适用于 json 数据,但如果正文请求是 urlencoded,则会失败。

 public override void OnAuthorization(HttpActionContext actionContext)
    {
        var request = actionContext.Request;

                try
                {
                    var content = actionContext.Request.Content.ReadAsStringAsync().Result;
                    var jsonResult = Newtonsoft.Json.JsonConvert.DeserializeObject<dynamic>(content);
                    _siteId = jsonResult["siteID"].ToString();
                    actionContext.Response = UserWorker.UserValidation(_siteId, request) as HttpResponseMessage;
                }
                catch (Exception e)
                {
                    actionContext.Response = request.CreateResponse(HttpStatusCode.BadRequest, e.Message);
                }

【问题讨论】:

    标签: c# json authorization httprequest x-www-form-urlencoded


    【解决方案1】:

    您可以从 Request 对象中获取内容类型。试试这个:

     public override void OnAuthorization(HttpActionContext actionContext)
        {
            var request = actionContext.Request;
    
            try
            {
                var content = actionContext.Request.Content.ReadAsStringAsync().Result;
                var contentType = request.Content.Headers.ContentType;
                string _siteId = string.Empty;
                if (contentType.MediaType == "application/json") //JSON case:
                {
                    dynamic jsonResult = Newtonsoft.Json.JsonConvert.DeserializeObject<dynamic>(content);
                    _siteId = jsonResult["siteID"].ToString();
                }
                else // form urlencode case:
                {
                    _siteId = content.Split('=')[0] == "siteID" ? content.Split('=')[1] : string.Empty;
    
                }
    
                actionContext.Response = UserWorker.UserValidation(_siteId, request) as HttpResponseMessage;
            }
            catch (Exception e)
            {
                actionContext.Response = request.CreateResponse(HttpStatusCode.BadRequest, e.Message);
            }
    
        }
    

    【讨论】:

    • 除了 content.Split 部分外,这一切都很好。我把那行改成_siteId = HttpUtility.ParseQueryString(content).Get("siteID");谢谢!
    猜你喜欢
    • 2013-07-12
    • 2011-05-02
    • 2019-01-01
    • 2011-01-05
    • 1970-01-01
    • 2013-07-09
    • 2013-03-22
    • 2016-07-11
    • 2014-02-10
    相关资源
    最近更新 更多