Asp.net web api 从另一个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
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吗?