通过全局请求从客户端和MVC传递信息以进行任何Web API调用

时间:2016-10-11 14:54:09

标签: asp.net-core asp.net-core-mvc asp.net-core-webapi asp.net-core-middleware

我需要从客户端和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请求全局添加此功能。

代码添加标题并调用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;

1 个答案:

答案 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;