Asp.net web api 从另一个Web API项目调用Web API

Asp.net web api 从另一个Web API项目调用Web API,asp.net-web-api,Asp.net Web Api,我有三个Web API项目 他们部署在 api: 移动电话: logApi: 我想这样做: 当其他项目中发生错误时,通过在logApi中调用控制器来记录错误。我已经阅读了 因此,我编写这个类是为了帮助向Web API控制器发送请求 public class WebApiRequest { public static T Get<T>(string url, object param = null, object header = null, Func<HttpRespo

我有三个Web API项目

他们部署在

  • api:
  • 移动电话:
  • logApi:
  • 我想这样做: 当其他项目中发生错误时,通过在logApi中调用控制器来记录错误。我已经阅读了

    因此,我编写这个类是为了帮助向Web API控制器发送请求

    public class WebApiRequest
    {
        public static T Get<T>(string url, object param = null, object header = null, Func<HttpResponseMessage, T> converter = null)
        {
            HttpClient client = GetClient(header);
            url = UrlHelper.BuildUrl(url, param);
            HttpResponseMessage response = client.GetAsync(url).Result;
            response.EnsureSuccessStatusCode();
            return converter != null ? converter(response) : DefaultConverter<T>(response);
        }
    
        public static T Post<T>(string url, object param = null, object header = null, Func<HttpResponseMessage, T> converter = null)
        {
            HttpClient client = GetClient(header);
            var content = new FormUrlEncodedContent(
                Tool.AnonymousObjectToDictionary(param).Where(i => i.Value != null).ToDictionary(i => i.Key, i => i.Value.ToString()));
            HttpResponseMessage response = client.PostAsync(url, content).Result;
            response.EnsureSuccessStatusCode();
            return converter != null ? converter(response) : DefaultConverter<T>(response);
        }
    
        public static T Put<T>(string url, object param = null, object header = null, Func<HttpResponseMessage, T> converter = null)
        {
            HttpClient client = GetClient(header);
            var content = new FormUrlEncodedContent(
                Tool.AnonymousObjectToDictionary(param).Where(i => i.Value != null).ToDictionary(i => i.Key, i => i.Value.ToString()));
            HttpResponseMessage response = client.PutAsync(url, content).Result;
            response.EnsureSuccessStatusCode();
            return converter != null ? converter(response) : DefaultConverter<T>(response);
        }
    
        public static T Delete<T>(string url, object param = null, object header = null, Func<HttpResponseMessage, T> converter = null)
        {
            HttpClient client = GetClient(header);
            url = UrlHelper.BuildUrl(url, param);
            HttpResponseMessage response = client.DeleteAsync(url).Result;
            response.EnsureSuccessStatusCode();
            return converter != null ? converter(response) : DefaultConverter<T>(response);
        }
    
        private static T DefaultConverter<T>(HttpResponseMessage response)
        {
            var formatters = new List<MediaTypeFormatter> {
                new JsonMediaTypeFormatter(),
                new XmlMediaTypeFormatter()
            };
            var result = response.Content.ReadAsAsync<T>(formatters).Result;
            return result;
        }
    
        public static string StringConverter(HttpResponseMessage response)
        {
            return response.Content.ReadAsStringAsync().Result;
        }
    
        private static HttpClient GetClient(object header)
        {
            HttpClient client = HttpClientFactory.Create(new DecompressionHandler());
            var headers = Tool.AnonymousObjectToDictionary(header);
            foreach (var h in headers.Where(h=>h.Value!=null)) {
                client.DefaultRequestHeaders.Add(h.Key, h.Value.ToString());
            }
            return client;
        }
    }
    
    公共类WebAPI请求
    {
    公共静态T Get(字符串url,对象参数=null,对象头=null,Func converter=null)
    {
    HttpClient=GetClient(头);
    url=UrlHelper.BuildUrl(url,参数);
    HttpResponseMessageResponse=client.GetAsync(url).Result;
    response.EnsureSuccessStatusCode();
    返回转换器!=null?转换器(响应):DefaultConverter(响应);
    }
    公共静态T Post(字符串url,对象参数=null,对象头=null,Func converter=null)
    {
    HttpClient=GetClient(头);
    var content=new FormUrlEncodedContent(
    其中(i=>i.Value!=null).ToDictionary(i=>i.Key,i=>i.Value.ToString());
    HttpResponseMessage response=client.PostAsync(url、内容).Result;
    response.EnsureSuccessStatusCode();
    返回转换器!=null?转换器(响应):DefaultConverter(响应);
    }
    公共静态T Put(字符串url,对象参数=null,对象头=null,Func converter=null)
    {
    HttpClient=GetClient(头);
    var content=new FormUrlEncodedContent(
    其中(i=>i.Value!=null).ToDictionary(i=>i.Key,i=>i.Value.ToString());
    HttpResponseMessage response=client.PutAsync(url、内容).Result;
    response.EnsureSuccessStatusCode();
    返回转换器!=null?转换器(响应):DefaultConverter(响应);
    }
    公共静态T Delete(字符串url,对象参数=null,对象头=null,Func converter=null)
    {
    HttpClient=GetClient(头);
    url=UrlHelper.BuildUrl(url,参数);
    HttpResponseMessage response=client.deleteAync(url).Result;
    response.EnsureSuccessStatusCode();
    返回转换器!=null?转换器(响应):DefaultConverter(响应);
    }
    专用静态T DefaultConverter(HttpResponseMessage响应)
    {
    var格式化程序=新列表{
    新的JsonMediaTypeFormatter(),
    新的XmlMediaTypeFormatter()
    };
    var result=response.Content.ReadAsAsync(格式化程序).result;
    返回结果;
    }
    公共静态字符串字符串转换器(HttpResponseMessage响应)
    {
    返回response.Content.ReadAsStringAsync().Result;
    }
    私有静态HttpClient GetClient(对象头)
    {
    HttpClient client=HttpClientFactory.Create(new DecompressionHandler());
    var headers=Tool.AnonymousObjectToDictionary(header);
    foreach(头文件中的var h.Where(h=>h.Value!=null)){
    Add(h.Key,h.Value.ToString());
    }
    返回客户;
    }
    }
    
    在测试项目中,它工作得非常完美

    但当我在WebAPI项目中使用它时,事情变得非常奇怪

        WebApiRequest.Post<ReturnModel<int>>(logUrl, new {
            Source = "{" + source + "}",
            context.Exception.Message,
            context.Exception.StackTrace,
            ExceptionType = context.Exception.GetType().FullName,
            PriorityLevel = 3,
            AddTime = DateTime.Now,
            ProjectType = (short)ProjectType.WebApi,
        }, request.Headers);
    
    webaprequest.Post(logUrl,新的{
    Source=“{”+源+“}”,
    context.Exception.Message,
    context.Exception.StackTrace,
    ExceptionType=context.Exception.GetType().FullName,
    PriorityLevel=3,
    AddTime=DateTime。现在,
    ProjectType=(短)ProjectType.WebApi,
    },request.Headers);
    
    代码看起来不错,但实际上HttpClient并没有请求我提供给它的url


    任何人都可以提供帮助,我对此表示感谢。

    您尝试调用的API是否在同一台机器上?在这种情况下,可能需要将URL添加到windows主机文件中。否则,能否请您提供更多的上下文来说明API的运行位置(同一台机器/不同),HttpClient正在请求什么,以及您希望它请求什么?谢谢您的评论。它们部署在同一台机器上。但即使是我也运行一个localhost Web API项目来请求。它仍然不工作。我希望它请求。但实际上它请求。您是否已经查看了您的主机文件?是的,无论我是否添加了规则,仍然不起作用。这段代码很难帮助您,URL参数从何而来?可能是代码中的某个地方从HttpContext.Current.Request.URL获得了URL,而这并没有指向您期望的URL吗?