我需要从客户端和MVC通过请求全局传递来自MVC和UI的任何Web API调用的信息。
我使用HttpClient进行WebApi调用。
我使用MVC的中间件拦截Web API调用,在Request中添加一些自定义标头,如下所示。以下是我的示例代码。
public async Task Invoke(HttpContext context)
{
context.Request.Headers.Add("AuditInfo", "xxxxxxxxxx");
await next.Invoke(context);
}
当我从WebApi检查请求标头时,我无法看到我在中间件中添加的标头。
注意:如果我在创建HttpClient时添加标题,我可以成功添加标题并从WebApi请求查看它,如下所示。但我想为从MVC和UI制作的Web API请求全局添加此功能。
HttpClient client = new HttpClient();
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue(" application / json"));
client.DefaultRequestHeaders.Add(" AuditInfo"," xxxxxxxxxx");
client.BaseAddress = new Uri(" http://localhost:62239/");
HttpResponseMessage response = client.GetAsync(" api / test /")。结果;
if(response.IsSuccessStatusCode) string jsonResponse = response.Content.ReadAsStringAsync()。Result;
答案 0 :(得分:0)
如果我理解正确,您希望在mvc应用程序中使用中间件来处理HttpClient
。中间件用于处理传入请求,而不是传出请求。由于HttpClient
请求是传出请求,因此您无法使用中间件来处理它。
但我想为Web API请求全局添加此功能
您可以为此创建一个HttpClient
工厂类:
public interface IHttpClientFactory
{
HttpClient GetClient();
}
public class HttpClientFactory : IHttpClientFactory
{
public HttpClient GetClient()
{
HttpClient client = new HttpClient();
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
client.DefaultRequestHeaders.Add("AuditInfo", "xxxxxxxxxx");
client.BaseAddress = new Uri("http://localhost:62239/");
return client;
}
}
然后,只要你需要得到它并使用它:
private readonly IHttpClientFactory _httpClientFactory;
....
var client = _httpClientFactory.GetClient();
HttpResponseMessage response = client.GetAsync("api/test/").Result;
if (response.IsSuccessStatusCode) string jsonResponse = response.Content.ReadAsStringAsync().Result;