3 つの Web API プロジェクトを取得しました。
彼らは
- API: http://api.domain.com
- mobileApi: http://mobile.api.domain.com
- logApi: http://log.api.domain.com
私はこれをしたい: 他のプロジェクトでエラーが発生した場合、logApi でコントローラーを呼び出してエラーを記録します。 http://www.asp.net/web-api/overview/web-api-clients/calling- a-web-api-from-a-net-client
そこで、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;
}
}
テストプロジェクトでは、完璧に動作します。
しかし、Web API プロジェクトで使用すると、事態は非常に奇妙になります。
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);
コードは問題ないように見えますが、実際には HttpClient は私が指定した URL を要求していません!!
どなたでもお手伝いできます。感謝の気持ちでいっぱいです。