gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 14:48:02 26 4
gpt4 key购买 nike

我想在 asp.net webapi 的消息处理程序中添加属性值。场景是我实现了 webapi,其中 authenticationToken 是不同请求的一部分,但客户端要求我在请求 header 中接受 token 。但一些应用程序已经在使用此 api 在请求正文中发送 token 。所以我不想改变实现。我想读取请求 header ,如果它包含 header ,则将该值分配给请求的属性。可能吗?

最佳答案

是的,可以在消息处理程序中修改您的请求 uriformdata。这是一个例子,你可以试试这个。我添加了一个 class APIKeyHandler 来处理这个问题,并在我的 WebApiConfig 中添加了处理程序。我已经在我的 Git 中上传了一个解决方案,您可以从 Example WebAPI with Modify Request Body in MessageHandler 查看它

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

ExampleAPIController代码:

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 请求调用示例:

enter image description here

GET 请求调用示例:

enter image description here

关于c# - 在消息处理程序中添加属性值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42749771/

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