我有asp.net core 2.1
个申请和HangFire 1.6.17
。 HangFire配置为以特定间隔执行后台作业。后台作业使用HttpClient调用外部API。如果http调用失败,则该方法将抛出带元数据的自定义异常。想法是hangfire将使用元数据记录异常。我跟着best-practices-for-exceptions创建了例外
public class MyHttpRequestException : Exception
{
public string Content { get; private set; }
public string RequestUri { get; private set; }
public string HttpResponse { get; private set; }
public MyHttpRequestException()
{
}
public MyHttpRequestException(string message)
: base(message)
{
}
public MyHttpRequestException(string message, Exception innerException)
: base(message, innerException)
{
}
public MyHttpRequestException(string message, string content, string httpResponse, string requestUri)
: base(message)
{
Content = content;
RequestUri = requestUri;
HttpResponse = httpResponse;
}
public override string ToString()
{
StringBuilder sb = new StringBuilder();
sb.Append(base.ToString());
sb.AppendLine();
sb.AppendLine();
sb.AppendLine("Content");
sb.AppendLine(Content);
sb.AppendLine("RequestUri");
sb.AppendLine(RequestUri);
sb.AppendLine("HttpResponse");
sb.AppendLine(this.HttpResponse);
return sb.ToString();
}
}
我还有HttpResponseMessage
的扩展方法,可以确保API请求成功,如果没有,则MyHttpRequestException
public static class HttpResponseMessageExtensions
{
public static async Task EnsureSuccessStatusCodeAsync(this HttpResponseMessage response)
{
if (response.IsSuccessStatusCode)
{
return;
}
var content = await response.Content.ReadAsStringAsync().ConfigureAwait(false);
var httpResponse = response.ToString();
var requestUri = response.RequestMessage.RequestUri.ToString()
if (response.Content != null)
response.Content.Dispose();
throw new MyHttpRequestException("Error while making http request.", content, httpResponse, requestUri);
}
}
这是我的后台作业,由Hangfire定期作业调度程序
调用public async Task DoSomething(string url)
{
var response = await _httpClient.GetAsync(url)
await response.EnsureSuccessStatusCodeAsync();
// do something here if everything is okay
}
问题
当EnsureSuccessStatusCodeAsync
方法抛出MyHttpRequestException
时,Hangfire会按预期记录异常,我会在HangFire的信息中心中看到该异常。但是,Hangfire仅记录异常消息和堆栈跟踪。 我没有看到我的自定义属性被记录(即内容,RequestUri,HttpResponse)
在clssic .NET中,我们使用像这样SO post的SerializationInfo 如何在.NET Core中创建自定义异常,以便元数据也会被记录?
注意:
当MyHttpRequestException
被抛出时,我注意到异常的ToString()方法被调用
但是,我没有看到任何ToString()返回被Hangfire记录。
我不知道这是否是hangfire问题,或者我需要实现MyHttpRequestException是不同的方式。