Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/30.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在消息处理程序中添加属性值_C#_Asp.net_Asp.net Mvc_Asp.net Web Api - Fatal编程技术网

C# 在消息处理程序中添加属性值

C# 在消息处理程序中添加属性值,c#,asp.net,asp.net-mvc,asp.net-web-api,C#,Asp.net,Asp.net Mvc,Asp.net Web Api,我想在asp.net webapi的消息处理程序中添加属性值。 场景是我实现webapi,其中authenticationToken是不同请求的一部分,但客户端要求我在请求头中接受令牌。但一些应用程序已经在使用这个api,并在请求体中发送令牌。 所以我不想改变实现。我想读取请求头,若它包含头,那个么将该值分配给请求的属性。 可以吗?可以,可以在消息处理程序中修改您的请求uri&formdata。这里有一个这样做的例子,你可以试试这个。我已经添加了一个类APIKeyHandler来处理这个问题,并

我想在asp.net webapi的消息处理程序中添加属性值。 场景是我实现webapi,其中authenticationToken是不同请求的一部分,但客户端要求我在请求头中接受令牌。但一些应用程序已经在使用这个api,并在请求体中发送令牌。 所以我不想改变实现。我想读取请求头,若它包含头,那个么将该值分配给请求的属性。
可以吗?

可以,可以在消息处理程序中修改您的请求
uri
&
formdata
。这里有一个这样做的例子,你可以试试这个。我已经添加了一个
类APIKeyHandler
来处理这个问题,并在我的
WebApiConfig
中添加了处理程序。我已经在我的Git中上传了一个解决方案,您可以从

WebApiConfig的代码

public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
        System.Web.Routing.RouteTable.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{action}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );

        //add the handler class in WebApiConfig
        config.MessageHandlers.Add(new APIKeyHandler());
    }
}
APIKeyHandler的代码:

public class APIKeyHandler : DelegatingHandler
{
    protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
    {
        var formData = await request.Content.ReadAsFormDataAsync();
        if (request.Method.Method.Equals("POST"))
        {
            request.Content = new FormUrlEncodedContent(ModifyYourFormData(formData, request));
        }
        request.RequestUri = new Uri(ModifyYourURI(request.RequestUri.ToString(), request), UriKind.Absolute);

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

    public IEnumerable<KeyValuePair<string, string>> ModifyYourFormData(NameValueCollection source, HttpRequestMessage request)
    {
        //Add your logic here

        string Authorized = "";
        try
        {
            Authorized = request.Headers.GetValues("AuthorizedKey").FirstOrDefault();
        }
        catch (Exception ex)
        {

        }

        List<KeyValuePair<string, string>> formData;
        formData = source.AllKeys.SelectMany(
            source.GetValues,
            (k, v) => new KeyValuePair<string, string>(k, v)).ToList();

        if (!string.IsNullOrEmpty(Authorized))
        {
            formData.Insert(0, new KeyValuePair<string, string>("AuthorizedKey", Authorized)); 
        }

        return formData;
    }

    public string ModifyYourURI(string uri, HttpRequestMessage request)
    {
        //Add your logic here

        string Authorized = "";
        try
        {
            Authorized = request.Headers.GetValues("AuthorizedKey").FirstOrDefault();
        }
        catch (Exception ex)
        {

        }

        if (!string.IsNullOrEmpty(Authorized))
        {
            return uri + "?AuthorizedKey="+ Authorized;
        }
        else
        {
            return uri;
        }
    }
}
public class ExampleAPIController : ApiController
{
    public async Task<string> Post()
    {
        string returnValue = "OK";

        var formKeyValueData = await Request.Content.ReadAsFormDataAsync();

        string AuthorizedKey = formKeyValueData["AuthorizedKey"];

        return returnValue;
    }

    public string Get(string AuthorizedKey)
    {
        string returnValue = "OK";
        return returnValue;
    }
}
POST请求调用示例:

获取请求调用示例:


我又想出了一个解决方案,可以在请求中添加动态属性

 if (request.Headers.Contains(HeaderName) && request.Method.Method.Equals("POST"))
            {
                var formData = await request.Content.ReadAsStringAsync();
                dynamic data = JsonConvert.DeserializeObject(formData);
                data.authenticationToken = request.Headers.GetValues(HeaderName).FirstOrDefault();
                request.Content = new StringContent(JsonConvert.SerializeObject(data), Encoding.UTF8, "application/json");
            }

我可以在handler方法中获取请求类型和请求对象属性的名称吗?