簡體   English   中英

ASP.NET Web API中的參數綁定

[英]Parameter Binding in 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集合是只讀的。

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可能具有編碼值。

我發現以下解決方案

request.RequestUri = new Uri(request.RequestUri + "&UserId=8");

var newFormDataCollection = new FormDataCollection(request.RequestUri);
request.Properties.Remove("MS_QueryNameValuePairs");
request.Properties.Add("MS_QueryNameValuePairs", newFormDataCollection);

return base.SendAsync(request, cancellationToken);

[FromURI]似乎使用了FormDataCollection中的值,因此您只需要更新“ MS_QueryNameValuePairs”屬性。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM