ASP.NET Web API中的参数绑定

迅雷

我的Web API中有一个用于身份验证(HMAC)的DelegatingHandler。

我想在请求中添加一个GET参数,以将用户的ID返回给我的控制器。

在我的处理程序中,我尝试像这样添加它:

public class SecurityHandler : DelegatingHandler
{
    protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
    {
        string apikey = request.Headers.GetValues(AuthConfig.ApiKeyHeader).First();
        UserDTO user = UserRepo.GetUser(apikey);
        if (user == null)
        {
            return SendResponseText("Invalid API key");
        }

        // Validate signature ...

        // Add user Id to the URI
        request.RequestUri = new Uri(request.RequestUri.OriginalString + "&UserId=" + user.Id);
        return base.SendAsync(request, cancellationToken);
    }
}

在我的控制器中,我可以从请求uri中获取新添加的参数,但是参数绑定无效

public class MyModel
{
    public int UserId { get; set; }
    ...
}

public string Get([FromUri] MyModel model)
{
    // model.UserId has not been set (= 0)
    // Request.RequestUri contains "&UserId=5"
}

更新

我猜想绑定是通过HttpContext中的Params完成的。我尝试过类似的操作,但是Params集合是只读的。

var newContext = request.Properties["MS_HttpContext"] as HttpContextWrapper;
newContext.Request.Params.Add("UserId", "8");
request.Properties.Remove("MS_HttpContext");
request.Properties.Add("MS_HttpContext", newContext);
网步

我已经在我的身边尝试过,并且可以正常工作。

这是我的示例网址。

http://localhost:50382/api/values?UserId=10

这是控制器动作。

public class ValueController : ApiController
{
    public IEnumerable<string> Get([FromUri]Model my)
            {
                return new string[] { "value1", "value2" , my.UserId.ToString() };
            }
}

根据您的评论,我创建了委托处理程序。

  public class MyMessageHandler : DelegatingHandler
  {
    protected override Task<HttpResponseMessage> SendAsync(
            HttpRequestMessage request, CancellationToken cancellationToken)
    {
        var myTempObj = new { id = 20 };
      /* You have to check this and remove this key. If key present that FromUri use cached properties*/
        if (request.Properties.ContainsKey("MS_QueryNameValuePairs"))
        {
            request.Properties.Remove("MS_QueryNameValuePairs");                
        }

        // Now prepare or update uri over here. It will surely work now.
            if (!string.IsNullOrEmpty(request.RequestUri.Query) && request.RequestUri.Query.Contains('?'))
            {
                request.RequestUri = new Uri(request.RequestUri + "&UserID=" + myTempObj.id);
            }
            else
            {
                request.RequestUri = new Uri(request.RequestUri + "?UserID=" + myTempObj.id);
            }    

        return base.SendAsync(request, cancellationToken);
    }
}

这是预期的工作。

如果您的原始请求包含userid,则它将被复制,并且将不起作用。返回0。

我也怀疑您使用的是request.RequestUri.OriginalString。只需尝试使用request.RequestUri。OriginalString可能具有编码值。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

ASP.NET Web API中的参数绑定

来自分类Dev

验证ASP.NET Web API模型绑定程序中的参数

来自分类Dev

asp.net Web api-模型绑定列表参数

来自分类Dev

Asp.Net Web Api Multipost参数

来自分类Dev

缓存Asp .Net Web API

来自分类Dev

Web API中的ASP.NET身份

来自分类Dev

Rest Web Api XML 绑定 - Asp.Net MVC

来自分类Dev

在 ASP.NET Web API 中创建输入参数和使用 java Web 服务功能

来自分类Dev

Web API ASP.NET中的NHibernate:没有会话绑定到当前上下文

来自分类Dev

带参数的ASP.NET Web Api HttpClient.GetAsync

来自分类Dev

ASP.NET Web API POST参数为null

来自分类Dev

Angularjs + ASP.NET MVC + ASP.NET Web API

来自分类Dev

ASP.NET Web API中带有可选参数的属性路由

来自分类Dev

AngularJS $ http使用参数中的对象访问ASP.NET Web Api

来自分类Dev

ASP.NET Web Api GET将不接受“。” URL参数中

来自分类Dev

如何在ASP.NET Web API中获取GET参数?

来自分类Dev

ASP.NET Web表单中的ASP.Net路由

来自分类Dev

装饰ASP.NET Web API IHttpController

来自分类Dev

ASP.net MVC Web API + Android

来自分类常见问题

从ASP.NET Web API返回HTML

来自分类Dev

视图中的ASP.NET Web Api

来自分类Dev

ASP.NET Web API操作缓存

来自分类Dev

ASP.Net Web API:添加appSettings

来自分类Dev

ASP.NET Web API登录方法

来自分类Dev

Web Api Asp.Net身份

来自分类Dev

验证ASP.NET Web API

来自分类Dev

ASP .NET Web API返回JSON文件

来自分类Dev

ASP.NET Web API的多个RoutePrefix

来自分类Dev

ASP.NET Web API会话数据