gpt4 book ai didi

c# - ASP.NET Web API 中的参数绑定(bind)

转载 作者:行者123 更新时间:2023-12-02 19:43:55 24 4
gpt4 key购买 nike

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

我想在请求中添加一个 GET 参数,以将用户的 ID 返回到我的 Controller 。

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

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

在我的 Controller 中,我可以从请求 uri 获取新添加的参数,但是参数绑定(bind)不起作用

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"
}

更新

我猜测绑定(bind)是通过 HttpContext 中的参数完成的。我尝试了类似的方法,但 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

这是 Controller 操作。

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

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

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

一切按预期进行。

如果您的原始请求包含用户 ID,那么它会重复并且无法工作。它返回0。

我还怀疑您正在使用 request.RequestUri.OriginalString。只需尝试使用 request.RequestUri 即可。 OriginalString 可能有编码值。

关于c# - ASP.NET Web API 中的参数绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27169378/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com